繁体   English   中英

为模板专门化添加更多类型

[英]Adding more types to template specialization

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

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


总结:请阅读文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM