在c++中,在typelist上键入visitor

type visitor over typelist in c++

本文关键字:visitor typelist c++      更新时间:2023-10-16

我正在寻找一种在c++类型列表上实现"类型"访问者的方法。在这里,我指的是类型访问者,以便在类型列表中的类型上执行特定的运算符(如sizeof)。

从概念上讲,我想做的是:

typedef TYPELIST_3(bool, int, double) tl;
size_t tl_size     = TL_sum_size<tl>();  // 13 = 1+4+8
size_t tl_min_size = TL_min_size<tl>();  // 1
size_t tl_max_size = TL_max_size<tl>();  // 8
vector<size_t> tl_sizes = TL_list_size<tl>();  // {1, 4, 8}
TL_AddCounter<tl>(3); // Call AddCounter(3) for each type in typelist

当然,每个函数都应该在类型列表上临时化。该示例在类型列表中使用sizeof和static void T::addCounter(int x)(以跟踪该类型的使用次数)。一般来说,我想用任意参数执行任何关于类型的任意"静态"操作。

首先,上面的任何函数都可能吗?如果是,我该怎么办?我不知道如何遍历typelist。

类似的东西可能会起作用:

#include <type_traits>
template <typename T>
struct SizeVisitor : std::integral_constant<unsigned int, sizeof(T)> { };
template <template <typename> class Visitor, typename ...Args> struct Visit;
template <template <typename> class Visitor, typename T, typename ...Rest>
struct Visit<Visitor, T, Rest...> : std::integral_constant<unsigned int,
    Visitor<T>::value + Vist<Visitor, Rest...>::value> { };
template <template <typename> class Visitor>
struct Visit<Visitor, T> : std::integral_constant<unsigned int, 0U> { };

现在你可以说Visit<SizeVisitor, double, char, int>::value了。

您可以修改这种方法,使其采用单个(比如tuple)类,而不是类型列表的裸类型,还可以将SizeVisitor泛化为一些任意的二进制函子,类似于std::accumulate(而不是0u,您将使用累加器的中性元素)。