gpt4 book ai didi

c++ - 通用实现获取类型列表的大小

转载 作者:行者123 更新时间:2023-12-02 10:19:26 25 4
gpt4 key购买 nike

如何为类型列表实现通用SizeOfT模板?我正在学习C++模板元编程,决定实现SizeOfT模板以获取类型列表包含的类型数。我想出了以下代码。

template <typename... Ts>
struct TypeList1;

template <typename... Ts>
struct TypeList2;

template <typename H, typename... Ts>
struct SizeOfT;

// Specialized for TypeList1
template <typename H, typename... Ts>
struct SizeOfT <TypeList1<H, Ts...>> {
constexpr static auto value = 1 + sizeof...(Ts);
};

template <>
struct SizeOfT <TypeList1<>> {
constexpr static auto value = 0;
};

// Specialized for TypeList2, works fine but
// it would be less code if generic SizeOfT can be implemented which can handle
// both TypeList1 and TypeList2 and maybe any future TypeList3 and so on...
template <typename H, typename... Ts>
struct SizeOfT <TypeList2<H, Ts...>> {
constexpr static auto value = 1 + sizeof...(Ts);
};

template <>
struct SizeOfT <TypeList2<>> {
constexpr static auto value = 0;
};

int main() {
using tl1 = TypeList1<int, char, bool>;
using tl2 = TypeList2<float, double>;

static_assert(SizeOfT<tl1>::value == 3, "tl1 size is not 3");
static_assert(SizeOfT<tl2>::value == 2, "tl2 size is not 2");

return 0;
}

在上面的代码中一切正常。但是,我想使 SizeOfT更通用,这样,如果添加了新的类型列表 TypeList3,则无需为此提供任何特殊化。

我正在使用符合C++ 11的编译器。

最佳答案

您可以在template template parameter的帮助下对SizeOfT进行部分特化处理。例如

template <typename H>
struct SizeOfT;

template <template <typename...> class TL, typename... Ts>
struct SizeOfT <TL<Ts...>> {
constexpr static auto value = sizeof...(Ts);
};

顺便说一句:您可以直接从 sizeof...获取模板参数的大小,并且不需要模板递归。

LIVE

关于c++ - 通用实现获取类型列表的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60882254/

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