Traits具有不同类型参数的泛型类的实现

时间:2013-02-05 11:47:04

标签: c++ templates c++11 variadic-templates typetraits

我有以下特征类

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;
};

谢谢!

2 个答案:

答案 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)

注意:即使您有多个正式模板参数(AB或您喜欢的多个),实际模板部分专业化单个班级Huh<A, B>

Variadic模板

如果您确实希望多个版本的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

上的输出

答案 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;
}

See it in action