在c++中,在typelist上键入visitor
type visitor over typelist in c++
我正在寻找一种在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
,您将使用累加器的中性元素)。
相关文章:
- 为什么我们需要在 Visitor 模式中 accept(),为什么我们不能直接调用 visitor.visit()?
- Antlr4 c++ visitor API
- 哪种算法需要"visitor"(提升库中的术语)?
- 使用模板实现"visitor pattern"
- Implementation of Loki IndexOf for a TypeList
- 关于"Node,File,Directory,Link"和"Visitor"
- 在哪里存储Visitor模式中访问的每个元素的计算结果
- 在c++中,在typelist上键入visitor
- 为什么'visitor pattern'要求每个类继承具有accept()函数的VisitorHost接口类?
- 使用boost::visitor和unique_ptr的boost::变体
- 从Typelist子集创建函数指针
- Usage of typelist