Предоставляет ли stdlib список типов? - PullRequest
4 голосов
/ 16 июня 2019

В современном C ++ стандартная библиотека предоставляет шаблон списка типов?

int main() {
    using int_types = type_list<int,long,short,char>;
    std::cout << length<int_types>::value << ' '
              << typeid(element<2,int_types>::type).name();
}

Обратите внимание, что int_types не хранит никаких значений (как std::tuple). Это просто список типов.

Ответы [ 2 ]

3 голосов
/ 16 июня 2019

Мне кажется, что в современной стандартной библиотеке C ++ ближайшее, что вам нужно, это std::tuple.

Если проблема в том, что std::tuple хранит значения перечисленных типов (поэтому, я полагаю,может быть проблема создания экземпляра объекта этого типа) легко написать инстанцируемый объект, который обертывает std::tuple using без создания экземпляра самого std::tuple.

Я имею в виду ... учитывая такую ​​оболочку

template <typename ... Ts>
struct wrapTuple
 {
   using type = std::tuple<Ts...>;

   template <std::size_t N>
   using element = std::tuple_element_t<N, type>;

   static constexpr auto length { std::tuple_size_v<type> };
 };

вы можете написать следующие строки без создания экземпляра оболочки

   using int_types = wrapTuple<int, long, short, char>;

   std::cout << int_types::length << ' '
      << typeid(int_types::element<2u>).name() << std::endl;

, но вы также можете создать его без создания экземпляра std::tuple

   int_types it;

   std::cout << it.length << ' '
      << typeid(decltype(it)::element<2u>).name() << std::endl;
2 голосов
/ 16 июня 2019

Используйте тип std::tuple, но не создавайте его:

#include <iostream>
#include <tuple>

int main()
{
    using int_types = std::tuple<int, long, short, char>;
    std::cout << std::tuple_size_v<int_types> << ' '
        << typeid(std::tuple_element_t<2, int_types>).name();
}

Выход MSVC:

4 short

Выход GCC:

4 s

Выход Clang:

4 s
...