Почему std :: initializer_list не поддерживает std :: get & lt; & gt ;, std :: tuple_size и std :: tuple_element

Почему std::initializer_list не поддерживается std::get<>, std::tuple_size а также std::tuple_element? Он часто используется в constexpr выражения, как сейчас, например,

std::max({1, 2, 3, 4, 5});

И если бы он сделал классные вещи, как следующие, было бы возможно

auto [x, y] = {1, 2};

Так почему же std::initializer_list не поддерживаете это? Насколько я знаю, нет способа построить std::initializer_list во время выполнения, поэтому размер всегда фиксируется пользователем.


Ниже приведен пример того, как можно получить размер std::intializer_list<> во время компиляции

#include <iostream>
#include <initializer_list>

using std::cout;
using std::endl;

template <typename...>  struct WhichType;

template <typename Type>
constexpr int size_init_list(std::initializer_list<Type> il) {
return il.end() - il.begin();
}

int main() {
constexpr auto size = size_init_list({1, 2, 3});
cout << static_cast<int>(std::integral_constant<int, size>{}) << endl;
return 0;
}

1

Решение

Даже если размер std::initializer_list является константой времени компиляции, размер не является частью типа. Каждый список инициализатора ints имеет тот же тип, а именно std::initializer_list<int>, А также std::tuple_size<std::initializer_list<int>>::value может иметь только одно возможное значение. Очевидно, что его нельзя использовать для получения фактического размера списка инициализаторов. Нет смысла определять его вообще.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]