常规模板
常规模板不会对其模板参数进行重载,但您可以对任意多个模板参数进行部分特化。只要您将; 放在每个结构声明/定义后面,您的代码就应该可以工作。 (请注意,将模板内的嵌套类型表示为type,将值表示为value 是一种习惯):
#include <iostream>
template<typename T>
struct FeatureType;
class Foo { };
template<> struct FeatureType<Foo>
{
typedef int type;
type value;
};
template<typename T> class Bar { };
template<typename T> struct FeatureType<Bar<T>>
{
typedef T type;
type value;
};
template<typename A, typename B> class Huh {};
template<typename A, typename B>
struct FeatureType< Huh<A,B> >
{
typedef A type;
type value;
};
int main()
{
FeatureType<Foo> f0;
f0.value = 0;
FeatureType< Bar<int> > f1;
f1.value = 1;
FeatureType< Huh<int, int> > f2;
f2.value = 2;
std::cout << f0.value << f1.value << f2.value;
}
LiveWorkSpace 上的输出(gcc 4.7.2)
注意:即使您有多个形式模板参数(A、B 或任意数量),实际模板也是部分专用对于单个班级Huh<A, B>
可变参数模板
如果你真的想让FeatureType 的多个版本采用不同数量的模板参数,你需要使用可变参数模板(C++11)
#include <iostream>
template<typename... Args>
struct FeatureType;
template<> struct FeatureType<int>
{
typedef int type;
type value;
};
template<typename T> struct FeatureType< T >
{
typedef T type;
type value;
};
template<typename A, typename B>
struct FeatureType< A, B >
{
typedef A type;
type value;
};
int main()
{
FeatureType< int > f0;
f0.value = 0;
FeatureType< int > f1;
f1.value = 1;
FeatureType< int, int > f2;
f2.value = 2;
std::cout << f0.value << f1.value << f2.value;
}
LiveWorkSpace 上的输出