在模板专业化中添加更多类型
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
工作。
摘要:阅读文档。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 如何获取多类型向量中的值(不添加 <type>)?
- 在模板专业化中添加更多类型