簡體   English   中英

在C ++中的typelist上訪問類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM