在模板专业化中添加更多类型

Adding more types to template specialization

本文关键字:添加 多类型 专业化      更新时间:2023-10-16

我有一个简单的模板类,我对每种类型进行实例化,它像这样:

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"的成员

来自std::array C 文档:

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工作。


摘要:阅读文档。