[英]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; }
};
因为int
和std::size_t
是两种不同的类型(具有不同的符号性),所以部分模板专业化将不匹配。 将int
更改为size_t
。
总结:请阅读文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.