当前位置:  开发笔记 > 编程语言 > 正文

如何获得专用模板以使用成员函数的非专业化版本?

如何解决《如何获得专用模板以使用成员函数的非专业化版本?》经验,为你挑选了1个好方法。

请考虑以下代码:

template 
struct vec
{
    vec normalize();
};


template <>
struct vec<3>
{
    vec cross_product(const vec& second);
    vec normalize();
};

template 
vec vec::normalize()
{
    // code to normalize vector here
    return *this;
}

int main()
{
    vec<3> direction;
    direction.normalize();
}

编译此代码会产生以下错误:

1> main.obj:错误LNK2019:未解析的外部符号"public:struct vec <3> __thiscall vec <3> :: normalize(void)"(?normalize @?$ vec @ $ 02 @@ QAE?AU1 @ XZ)引用在函数_main中

Johannes Sch.. 9

你不能:)你想要的是专门化成员函数:

template 
struct vec
{
    // leave the function undefined for everything except dim==3
    vec cross_product(const vec& second);
    vec normalize();
};

template<>
vec<3> vec<3>::cross_product(const vec& second) {
    // ...
}

template 
vec vec::normalize()
{
    // code to normalize vector here
    return *this;
}

另一个稍微复杂的解决方案是使用boost::enable_if:

template 
struct vec
{
    // function can't be called for dim != 3. Error at compile-time
    template
    typename boost::enable_if_c< dim == dim1 && dim1 == 3, vec >::type 
    cross_product(const vec& second) {
        // ...
    }
    vec normalize();

    // delegate to the template version
    void without_params() {
        // delegate
        this->without_params();
    }

private:
    // function can't be called for dim != 3. Error at compile-time
    template
    typename boost::enable_if_c< dim == dim1 && dim1 == 3 >::type 
    without_params() {
        // ...
    }   
};

template 
vec vec::normalize()
{
    // code to normalize vector here
    return *this;
}

如果为任何dim调用cross_product,那将导致编译时错误!= 3.请注意,'trick'仅适用于带参数的函数,因为只有这样才能自动推导出模板参数.对于没有参数的情况,我提供了without_parameters上面的函数:).



1> Johannes Sch..:

你不能:)你想要的是专门化成员函数:

template 
struct vec
{
    // leave the function undefined for everything except dim==3
    vec cross_product(const vec& second);
    vec normalize();
};

template<>
vec<3> vec<3>::cross_product(const vec& second) {
    // ...
}

template 
vec vec::normalize()
{
    // code to normalize vector here
    return *this;
}

另一个稍微复杂的解决方案是使用boost::enable_if:

template 
struct vec
{
    // function can't be called for dim != 3. Error at compile-time
    template
    typename boost::enable_if_c< dim == dim1 && dim1 == 3, vec >::type 
    cross_product(const vec& second) {
        // ...
    }
    vec normalize();

    // delegate to the template version
    void without_params() {
        // delegate
        this->without_params();
    }

private:
    // function can't be called for dim != 3. Error at compile-time
    template
    typename boost::enable_if_c< dim == dim1 && dim1 == 3 >::type 
    without_params() {
        // ...
    }   
};

template 
vec vec::normalize()
{
    // code to normalize vector here
    return *this;
}

如果为任何dim调用cross_product,那将导致编译时错误!= 3.请注意,'trick'仅适用于带参数的函数,因为只有这样才能自动推导出模板参数.对于没有参数的情况,我提供了without_parameters上面的函数:).

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有