5

考虑这个类模板:

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) 中做到这一点?

4

2 回答 2

8

部分专业化:

// 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> {};
于 2012-11-22T14:59:03.363 回答
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类。在这种情况下,特征类将完全专用于单个参数。

于 2012-11-22T14:59:44.433 回答