c++ - 使用模板化构造函数实例化非模板类

标签 c++ templates

我有一个小的 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、intchar 我会非常乐意明确地专门化少数类型。

更新:@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/

相关文章:

c# - 泛型/模板中的长(可读)名称

c++ - 如何转发声明已在其他地方使用默认值转发声明的模板类型

c++ - 使用指针作为返回类型实现模板化接口(interface)的函数 -> 冲突返回类型错误

c++ - 模板编译失败 : 'double' is not a valid type for a template constant parameter

c++ - C指针地址打印

c++ - Winapi-将LPWCSTR传递为LPCSTR

c++ - sizeof struct with pack(push,1)

templates - 期望无限递归模板实例化?

c++ - 为项目构建大型库时的最佳实践

c++ - 绝对路径...困惑(ubuntu)