我有一个小的 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
- 它不是真正的模板化类 - 而是一种方便的实例化方法。当它包含在真正模板化的函数中时:
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()
最佳答案
如果您确实只对少数几个基本类型感兴趣,并且可以手动对它们进行特殊化,这似乎是一个不错的选择。
template <typename T>
struct TypeInfo; // default values could go here for un-specified types
template <>
struct TypeInfo<int> {
const std::size_t elm_size = sizeof(T);
const std::string type_name = "int";
}
// more specializations for double, char and float
然后您可以继续使用它,只需使用模板参数进行实例化即可。
如果 TypeInfo
的不同实例是不同类型的事实是一个问题,您可以使用一个函数返回一个普通的 TypeInfo
对象,并根据以下设置正确的值传递给函数的参数。
template <typename T>
TypeInfo get_type_info() {
return TypeInfo{sizeof(T), "unknown"};
}
template <>
TypeInfo get_type_info<int>() {
return TypeInfo{sizeof(T), "int"};
}
auto type_info = get_type_info<int>();
关于c++ - 使用模板化构造函数实例化非模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55030816/