gpt4 book ai didi

c++ - 为什么我们需要模板模板参数的模板特化

转载 作者:行者123 更新时间:2023-11-30 03:15:39 24 4
gpt4 key购买 nike

以这段代码为例,确定一个类型列表的长度:

template <class... Types>
class type_list {};

template <class TypeList>
struct type_list_length; // <---

template <template <class...> class type_list, class... Types>
struct type_list_length<TypeList<Types...>>
{
static constexpr std::size_t value = sizeof...(Types);
};

Godbolt

为什么我们需要标记声明?我尝试在几个编译器中编译没有它的代码,但总是出错。

最佳答案

But why do we need the specialization in the first place?

因为您使用 class如下

std::cout << type_list_length<type_list<int, long, long long>>::value;
// ...........................^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <- template argument

或者还有

std::cout << type_list_length<std::tuple<int, long, long long>>::value;
// ...........................^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <- template argumen

或以类似的方式。

观察模板参数:在这两种情况下都是类型type_list<int, long, long long>在第一种情况下,std::tuple<int, long, long long> .

所以你不能声明type_list_length作为接收模板模板类型

template <template <class...> class type_list, class... Types>
struct type_list_length // <--- doesn't work
{
static constexpr std::size_t value = sizeof...(Types);
};

因为你应该调用它来传递一个模板模板参数,后跟一个模板的可变列表;我的意思是......你应该按如下方式使用它

std::cout << type_list_length<type_list, int, long, long long>::value;
std::cout << type_list_length<std::tuple, int, long, long long>::value;

但是,这样一来,您就失去了类的力量:提取并计算类型参数的模板参数。

所以你需要先声明type_list_length作为接收类型

template <typename> // no template parameter name needed here (not used)
struct type_list_length;

然后在接收到的类型是带参数的模板模板的情况下声明并定义一个特化

template <template <typename...> class type_list, typename... Types>
struct type_list_length<TypeList<Types...>>
{ // ...................^^^^^^^^^^^^^^^^^^ the parameter is a type
static constexpr std::size_t value = sizeof...(Types);
};

关于c++ - 为什么我们需要模板模板参数的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56875637/

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