常规模板
常规模板不会对其模板参数进行重载,但您可以对任意多个模板参数进行部分特化。只要您将;
每个结构声明/定义放在后面,您的代码就应该可以工作。(请注意,将模板内的嵌套类型表示为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上的输出