2012-11-22 84 views
3

考虑这个类模板:现在模板模式匹配

template <typename T1, typename T2, bool B> 
class SomeClass { }; 

,我想提供基于B==trueB==false两种实现方式。也就是说,我想说的是这样的:

template <ANYTHING, ANYTHING, true> class SomeClass { 
// First implementation 
}; 

template <ANYTHING, ANYTHING, false> class SomeClass { 
// Second implementation 
}; 

这怎么能在C++(11)中完成?

回答

6

随着偏特:

// 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

太棒了!这回答了我的问题。谢谢。你为什么使用这个包装? – Cartesius00

+0

请注意,第一个版本不适用于'Foo >'。我不知道这是否可取。 –

+0

@ R.MartinhoFernandes你的意思是第二个版本,对吧? – pmr

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 
}; 

注意,如果大部分的执行是一样的,你也可以写一个通用版本,其中仅依赖于布尔参数代码委托给特质类。在这种情况下,特质类将完全专用于单个参数。

+0

也是一个完美的答案。谢谢。 – Cartesius00