考虑这个类模板:
template <typename T1, typename T2, bool B>
class SomeClass { };
现在,我想基于B==true
和B==false
提供两种实现方式。也就是说,我想说的是:
template <ANYTHING, ANYTHING, true> class SomeClass {
// First implementation
};
template <ANYTHING, ANYTHING, false> class SomeClass {
// Second implementation
};
如何在C ++(11)中完成?
答案 0 :(得分:7)
部分专业化:
// primary
template<typename X, typename Bool>
struct Foo;
template<typename X>
struct Foo<X, std::true_type> {};
template<typename X>
struct Foo<X, std::false_type> {};
// use
Foo<X, std::true_type> x;
我为bool
使用了一个类型包装器,但你也可以使用它
非类型模板参数:
// primary
template<typename, bool>
struct Foo;
template<typename X>
struct Foo<X, true> {};
template<typename X>
struct Foo<X, false> {};
// use
Foo<X, true> x;
有时您可以计算用于部分特化的值 在默认参数中使用元编程:
// primary
template<typename X, typename is_integral_ = std::is_integral<X>::type>
struct Foo;
这使得配置变量可以由用户选择覆盖。
struct my {};
Foo<my, std::true_type> x;
为防止这种情况,请通过继承调度:
// primary, where Foo_impl is any of the above
template<typename X>
struct Foo : public Foo_impl<X> {};
答案 1 :(得分:4)
它被称为部分特化:
template <typename T1, typename T2> class SomeClass<T1 ,T2, true> {
// First implementation
};
template <typename T1, typename T2> class SomeClass<T1, T2, false> {
// Second implementation
};
如名称所示,它与(完整)专业化相关,如下所示:
template <> class SomeClass<int, char, false> {
// dedicated version for T1=int, T2=char, B=false
};
请注意,如果大部分实现都相同,您还可以编写一个通用版本,其中只有依赖于bool参数的代码才会委托给 trait 类。在这种情况下,trait类将完全专注于单个参数。