可能很容易解决,但很难找到解决方案:
是否有可能(部分)专注于一整套类型? 在示例中,“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)进行部分特殊处理的任何想法?
答案 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> {};
虽然它不是一个模板定义(如你所要求的),但可以避免代码重复。
答案 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> { ... };