[英]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
當然,每個函數都應在類型列表上進行模板化。 該示例使用static void T::addCounter(int x)
sizeof和static void T::addCounter(int x)
(以跟蹤使用該類型的時間)。 通常,我想對帶有任意參數的類型執行任何任意的“靜態”操作。
好吧,首先,以上功能是否可能? 是,該怎么辦? 我不確定如何通過類型列表進行迭代。
這樣的事情可能會起作用:
#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
, d具有蓄電池的中性元件)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.