Generi c реализация, чтобы получить размер typelist - PullRequest
1 голос
/ 27 марта 2020

Как реализовать шаблон generi c SizeOfT для списков типов? Я изучаю метапрограммирование шаблона C ++, решил реализовать шаблон SizeOfT, чтобы получить количество типов, которые содержит список типов. Я придумал следующий код.

template <typename... Ts>
struct TypeList1;

template <typename... Ts>
struct TypeList2;

template <typename H, typename... Ts>
struct SizeOfT;

// Specialized for TypeList1
template <typename H, typename... Ts>
struct SizeOfT <TypeList1<H, Ts...>> {
    constexpr static auto value = 1 + sizeof...(Ts);
};

template <>
struct SizeOfT <TypeList1<>> {
    constexpr static auto value = 0;
};

// Specialized for TypeList2, works fine but
// it would be less code if generic SizeOfT can be implemented which can handle
// both TypeList1 and TypeList2 and maybe any future TypeList3 and so on...
template <typename H, typename... Ts>
struct SizeOfT <TypeList2<H, Ts...>> {
    constexpr static auto value = 1 + sizeof...(Ts);
};

template <>
struct SizeOfT <TypeList2<>> {
    constexpr static auto value = 0;
};

int main() {
    using tl1 = TypeList1<int, char, bool>;
    using tl2 = TypeList2<float, double>;

    static_assert(SizeOfT<tl1>::value == 3, "tl1 size is not 3");
    static_assert(SizeOfT<tl2>::value == 2, "tl2 size is not 2");

    return 0;
}

Все отлично работает в приведенном выше коде. Тем не менее, я хотел бы сделать SizeOfT более универсальным c, чтобы при добавлении нового списка типов TypeList3 мне не требовалось предоставлять какую-либо специализацию для этого.

Я использую C ++ 11 совместимый компилятор.

1 Ответ

1 голос
/ 27 марта 2020

Вы можете частично специализировать SizeOfT с помощью параметра шаблона шаблона . например,

template <typename H>
struct SizeOfT;

template <template <typename...> class TL, typename... Ts>
struct SizeOfT <TL<Ts...>> {
    constexpr static auto value = sizeof...(Ts);
};

Кстати: размер параметров шаблона можно получить непосредственно из sizeof... и не требовать рекурсии шаблона.

LIVE

...