假设我有这门课程:
template</*some other parameters here */class toggle>
class Foo
{
void function();
//Lots of other non-parametrized member functions
}
现在,如果切换属于某种类型,我希望函数使用替代实现,对于所有其他情况,我希望它使用标准实现。这应该在编译时完全完成,因为类的外部用户应该能够实例化该模板(故意,为了节省内存和一点性能)缺少一些功能。
捕获:简单地专注于整个班级是不现实的,因为Foo将有许多其他方法不依赖于这种切换,这也必须再次实施,使一切都浪费大量空间。
答案 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;
}