整个参数集的模板特化

时间:2011-04-17 16:42:44

标签: c++ templates

可能很容易解决,但很难找到解决方案:

是否有可能(部分)专注于一整套类型? 在示例中,“Foo”应该部分专用于(T,int)和(T,double),只有一个模板定义。

我能做的是为(T,int)定义一个特化。见下文。但是,它应该是(T,int)(T,double),只有一个函数定义(没有代码加倍)。

template <typename T,typename T2>
struct Foo
{
  static inline void apply(T a, T2 b) 
  {
    cout << "we are in the generic template definition" << endl;
  }
};

// partial (T,*)
template <typename T>
struct Foo<T, int >     // here something needed like T2=(int, double)
{
  static inline void apply(T a, T2 b) 
  {
    cout << "we are in the partial specialisation for (T,int)" << endl;
  }
};

有关如何使用一个模板定义对(T,int)和(T,double)进行部分特殊处理的任何想法?

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,那么您可以编写基类模板并从中派生出来,如下图所示:

template <typename T, typename U>
struct Foo_Base
{
  static inline void apply(T a) 
  {
    cout << "we are in the partial specialisation Foo_Base(T)" << endl;
  }
};

template <typename T>
struct Foo<T, int> : Foo_Base<T, int> {};

template <typename T>
struct Foo<T, double> : Foo_Base<T, double> {};

虽然它不是一个模板定义(如你所要求的),但可以避免代码重复。

演示:http://www.ideone.com/s4anA

答案 1 :(得分:0)

我相信你可以使用Boost的enable_if来实现这一点,以便为你想要的类型启用部分特化。第3.1节显示了如何,并给出了这个例子:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };