gpt4 book ai didi

c++ - 向模板特化添加更多类型

转载 作者:行者123 更新时间:2023-11-30 03:26:01 25 4
gpt4 key购买 nike

我有一个简单的模板类,我为每个使用它的类型实例化它,如下所示:

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; }
};

error: ‘class_name’ is not a member of ‘std::array’

最佳答案

来自 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; }
};

因为 intstd::size_t 是两种不同的类型(具有不同的符号性),部分模板特化将不匹配。将 int 更改为 size_t 有效。


总结:阅读文档。

关于c++ - 向模板特化添加更多类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com