Тип посетителя над списком типов в C ++ - PullRequest
1 голос
/ 04 января 2012

Я ищу способ реализации посетителя типа через список типов 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) в списке типов (чтобы отследить, сколько раз этот тип используется).В общем, я хочу выполнить любую произвольную «статическую» операцию над типом с произвольными параметрами.

Ну, во-первых, возможна ли какая-либо из вышеперечисленных функций?если да, как я могу это сделать?Я не уверен, как перебирать список типов.

1 Ответ

1 голос
/ 04 января 2012

Примерно так может работать:

#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 у вас будет нейтральный элемент аккумулятора).

...