C++ не позволяет ,увы , выводить тип для массивов:
auto a[] = {1,2,3};
Есть конечно std::make_array, но он создает std::array<T,N>, а не T[N].
Почему в C++14 не сделали синтаксис для массивов , может кто знает планируют ли вообще ?
Здравствуйте, _NN_, Вы писали:
_NN>C++ не позволяет ,увы , выводить тип для массивов:
Да будет вам. В ногу то выстрелить всегда можно.
Делай раз: заводим алиас
template <typename T, int N> using c_array = T[N];
template<typename T> using unsized_c_array = T[];
Делай два: стреляем в ногу
auto &&x = с_array<int,5>{};
auto &&y = unsized_с_array<int>{1, 2, 3};
Здравствуйте, Tilir, Вы писали:
T>Да будет вам. В ногу то выстрелить всегда можно.
T>Делай раз: заводим алиас
T>T>template <typename T, int N> using c_array = T[N];
T>template<typename T> using unsized_c_array = T[];
T>
T>Делай два: стреляем в ногу
T>T>auto &&x = с_array<int,5>{};
T>auto &&y = unsized_с_array<int>{1, 2, 3};
T>
А где тут вывод типа для массива ?
Вместо <int, 5> уж лучше написать int x[] и компилятор сам размер вычислит.
Здравствуйте, Tilir, Вы писали:
_NN>>Вместо <int, 5> уж лучше написать int x[] и компилятор сам размер вычислит.
T>Не понял мысль. Можно код?
Сорри не заметил unsized_с_array
Осталось как-нибудь сделать unsized_c_array без указания типа.
Здравствуйте, _NN_, Вы писали:
_NN>Осталось как-нибудь сделать unsized_c_array без указания типа.
Чтобы вывести тип из initializer_list, нам надо его обработать, т.е. это уже сразу должна быть функция-шаблон. Если попробовать её написать в очевидном виде:
template<typename... T>
c_array <typename std::common_type<T...>::type, sizeof...(T)>
make_c_array(T &&...t) {
return {std::forward<T>(t)...};
}
То мы наталкиваемся на сишное ограничение:
error: ‘make_c_array’ declared as function returning an array
Но мы можем схитрить: упаковать массив в структуру и возвращать его упакованным.
#include <iostream>
#include <typeinfo>
template <typename T, int N> using c_array = T[N];
template<typename T, int N>
struct packed_array
{
c_array<T, N> data;
};
template<typename... T>
packed_array <typename std::common_type<T...>::type, sizeof...(T)>
make_c_array(T &&...t) {
return {{std::forward<T>(t)...}};
}
int foo (void)
{
auto &&x = make_c_array (1,2,3,4,5).data;
std::cout << typeid(x).name() << "\n";
return x[2];
}
int
main (void)
{
int x[5];
std::cout << typeid(x).name() << "\n";
std::cout << foo() << "\n";
return 0;
}
Хм.
У меня тут есть сомнения не перехитрил ли я где сам себя, но отладочный вывод вроде корректный.