【发布时间】:2019-03-06 19:28:30
【问题描述】:
我有一个小型 C++ 类,它包含一些基本类型的类型信息;简化版如下所示:
struct TypeInfo {
TypeInfo(std::size_t elm_size, const std::string& type_name) :
elm_size(elm_size),
type_name(type_name)
{}
std::size_t elm_size;
std::string type_name;
}
TypeInfo double_info(sizeof double, "double");
TypeInfo int_info(sizeof int, "int");
这可行——但我希望能够基于普通 C++ 模板实例化 TypeInfo 对象;即这样的事情:
TypeInfo<double> double_info; // <- This does not work
因为这样的类不包含任何T - 它不是真正的模板类 - 而是一种方便的实例化方法。当 this 包含在真正模板化的函数中时:
void vector_operation(const std::vector<T>& data) {
TypeInfo<T> type_info; // <- This does not work!
}
如果我可以基于模板参数实例化TypeInfo 实例,那将是真正很有帮助的。因为我只需要涵盖少数基本类型 - float, double, int 和 char,我会非常乐意明确地专门化少数类型。
更新:@nathan_oliver 建议将类作为一个整体做成模板,然后使用sizeof(T) 确定元素大小。该解决方案的问题(如我所见) - 用户仍然需要提供 type_name 字符串(以及更多特定于类型的信息) - 我想专门化我需要的几种类型 - 然后完全指定:
template <typename T>
struct TypeInfo {
TypeInfo();
std::size_t elm_size;
std::string type_name;
}
然后在.cpp文件中:
template<>
TypeInfo::TypeInfo<double>() {
this->elm_size = sizeof(double);
this->type_name = "double";
}
template<>
TypeInfo::TypeInfo<int>() {
this->elm_size = sizeof(int);
this->type_name = "int";
}
但这甚至不能编译:
type_info.cpp:46:5: error:
invalid use of template-name ‘TypeInfo’ without an argument list
TypeInfo::TypeInfo()
【问题讨论】:
-
你有一个错字。
TypeInfo::TypeInfo<double>()应该是TypeInfo<double>::TypeInfo() -
另外,您不能将模板放入 cpp 文件中:stackoverflow.com/questions/495021/…
-
谢谢——那个错字不是错字;它缺乏能力。我在 cpp 文件中有模板 specializations - 这应该可以吗?
-
如果另一个翻译单元使用它,则 cpp 中的专业化将不起作用。所有模板代码都应该在一个头文件中。