向模板专业化添加更多类型

时间:2018-02-05 15:19:44

标签: c++ templates

我有一个简单的模板化类,我为每个使用它的类型实例化,如下所示:

template<class T> struct meta {
  static const std::string& get_name() {return T::class_name;}
};

template<> struct meta<double> {
  static constexpr const char* class_name = "double";
  static const char* get_name() { return class_name; }
};

template<> struct meta<std::vector<double> {
  static constexpr const char* class_name = "std::vector<double>";
  static const char* get_name() { return class_name; }
};

template<> struct meta<std::array<double,2>> {
  static constexpr const char* class_name = "double[]";
  static const char* get_name() { return class_name; }
};

然后我可以这样使用这些:

int main() {
  std::cout << meta<double>::get_name() << '\n';
  std::cout << meta<std::vector<double> >::get_name() << '\n';
  std::cout << meta<std::array<double,2> >::get_name() << '\n';
}

我使用宏来为每个基类型生成模板特化的变体,但我坚持std::array,因为它包含基类型整数。我想知道如何将一个新的模板化参数添加到已经模板化的特化中,这样我就不需要为每个可能的整数值进行专门化。

我试过了:

template<int I> struct meta<std::array<double,I>> {
    static constexpr const char* class_name = "double[]";
    static const char* get_name() { return class_name; }
};
  

错误:'class_name'不是'std :: array'

的成员

1 个答案:

答案 0 :(得分:2)

来自std::array C ++ documentation

template< 
    class T, 
    std::size_t N 
> struct array;

所以,你需要

template<std::size_t I> struct meta<std::array<double, I>> {
    static constexpr const char* class_name = "double[]";
    static const char* get_name() { return class_name; }
};

由于intstd::size_t是两种不同类型(具有不同的签名),因此部分模板专精化不会匹配。将int更改为size_t有效。

总结:阅读文档。