如何根据模板参数选择替代成员函数实现?

时间:2012-02-29 16:39:16

标签: c++ templates

假设我有这门课程:

template</*some other parameters here */class toggle>
class Foo
{
   void function();
   //Lots of other non-parametrized member functions
}

现在,如果切换属于某种类型,我希望函数使用替代实现,对于所有其他情况,我希望它使用标准实现。这应该在编译时完全完成,因为类的外部用户应该能够实例化该模板(故意,为了节省内存和一点性能)缺少一些功能。

捕获:简单地专注于整个班级是不现实的,因为Foo将有许多其他方法不依赖于这种切换,这也必须再次实施,使一切都浪费大量空间。

4 个答案:

答案 0 :(得分:6)

我认为这就是你要求的:

#include <iostream>
#include <string>

template <class toggle>
class Foo
{
public:
    void function() { std::cout << "Default\n"; }
};

template <>
void Foo<int>::function() { std::cout << "int\n"; }

int main ()
{
    Foo<std::string>().function();
    Foo<int>().function();

    return 0;
}

输出:

Default
int

答案 1 :(得分:3)

您可能会专门研究基类:

template<class toggle>
class FooFunction {
public:
    void function();
};

template<>
class FooFunction<blah> {
public:
    void function();
};

template<class toggle>
class Foo : public FooFunction<toggle> {
    //Lots of other non-parametrized member functions
};

答案 2 :(得分:1)

如果您可以接受function一组重载的功能模板,那么:

// toggle is not a dependent type so we solve that
template<
    typename T = toggle
    , typename = typename std::enable_if<
        std::is_same<T, int>::value
    >::type
>
void function()
{ /* implementation for int */ }

template<
    typename T = toggle
    , typename = typename std::enable_if<
        !std::is_same<T, int>::value
    >::type
    // dummy parameter to make this declaration distinct from the previous one
    typename = void
>
void function()
{ /* implementation for others */ }

这是用C ++ 11风格编写的,但可以与C ++ 03一起使用。 (在某些情况下,这可能依赖于SFINAE在某种程度上是C ++ 03的灰色区域,但我对规则知之甚少。)

答案 3 :(得分:1)

模板专业化,尝试调试它,并注意并非所有功能都需要专门化:

template <class T> class Spec
{
public:
    void Func()
    {
    }

    void Func2()
    {
    }

};


void Spec<double>::Func()
{

}

int main( int argc, char *argv )
{

    Spec<int> spec1;
    spec1.Func();
    spec1.Func2();

    Spec<double> spec2;
    spec2.Func();
    spec2.Func2();


    return 0;
}