我有以下特征类
template<typename T> struct FeatureType;
我就是这样使用它,效果很好:
class Foo { };
template<> struct FeatureType<Foo> {
typedef int value;
};
template<typename T> class Bar { };
template<typename T> struct FeatureType<Bar<T>> {
typedef T value;
};
有没有办法将泛型类型的实现扩展到具有多个类型参数的那些(与上面的Bar
不同)?以下不起作用
template<typename A, typename B> class Huh { };
template<typename A, typename B> struct FeatureType<Huh<A,B>> {
typedef A value;
};
谢谢!
答案 0 :(得分:1)
常规模板的模板参数不会过载,但您可以在任意多个模板参数上对它们进行部分特殊处理。只要将;
置于每个结构声明/定义的后面,您的代码就应该工作。 (请注意,将模板中的嵌套类型表示为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;
}
上的输出
答案 1 :(得分:0)
我不确定你尝试了什么,但你确定可以专注于你喜欢的模板参数:
template <typename A, typename B>
class foo { };
template <typename T>
struct feature_type {};
template <typename A, typename B>
struct feature_type<foo<A,B>> {
typedef A type1;
typedef A type2;
};
int main(int argc, const char* argv[])
{
typename feature_type<foo<int,char>>::type1 x;
typename feature_type<foo<int,char>>::type2 y;
return 0;
}