获取类型列表大小的通用实现
Generic implementation to get size of typelist
如何为类型列表实现通用 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...
获取模板参数的大小,不需要模板递归。
如何为类型列表实现通用 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...
获取模板参数的大小,不需要模板递归。