我有一个简单的模板化类,我为每个使用它的类型实例化,如下所示:
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'
的成员
答案 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; }
};
由于int
和std::size_t
是两种不同类型(具有不同的签名),因此部分模板专精化不会匹配。将int
更改为size_t
有效。
总结:阅读文档。