auto и массив
От: _NN_ www.nemerleweb.com
Дата: 03.08.14 09:47
Оценка:
C++ не позволяет ,увы , выводить тип для массивов:

auto a[] = {1,2,3};


Есть конечно std::make_array, но он создает std::array<T,N>, а не T[N].
Почему в C++14 не сделали синтаксис для массивов , может кто знает планируют ли вообще ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: auto и массив
От: Tilir Россия http://tilir.livejournal.com
Дата: 03.08.14 10:42
Оценка: +1
Здравствуйте, _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};
Re[2]: auto и массив
От: _NN_ www.nemerleweb.com
Дата: 03.08.14 11:02
Оценка:
Здравствуйте, 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[] и компилятор сам размер вычислит.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: auto и массив
От: Tilir Россия http://tilir.livejournal.com
Дата: 03.08.14 12:10
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А где тут вывод типа для массива ?


Если "auto нечто = выражение" выводит тип(нечто) ==> int x[N], то это несомненно является выводом типа для массива.
Самое главное в этом рецепте это использование rvalue reference. Семантически массив в C это не lvalue, и мы обязаны это явно указать.

_NN>Вместо <int, 5> уж лучше написать int x[] и компилятор сам размер вычислит.


Не понял мысль. Можно код?
Re[4]: auto и массив
От: _NN_ www.nemerleweb.com
Дата: 03.08.14 12:57
Оценка:
Здравствуйте, Tilir, Вы писали:

_NN>>Вместо <int, 5> уж лучше написать int x[] и компилятор сам размер вычислит.


T>Не понял мысль. Можно код?

Сорри не заметил unsized_с_array

Осталось как-нибудь сделать unsized_c_array без указания типа.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: auto и массив
От: Tilir Россия http://tilir.livejournal.com
Дата: 03.08.14 14:49
Оценка:
Здравствуйте, _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;
}


Хм.

У меня тут есть сомнения не перехитрил ли я где сам себя, но отладочный вывод вроде корректный.
Re[6]: auto и массив
От: _NN_ www.nemerleweb.com
Дата: 04.08.14 06:59
Оценка:
Здравствуйте, Tilir, Вы писали:

T>У меня тут есть сомнения не перехитрил ли я где сам себя, но отладочный вывод вроде корректный.


В итоге ,к сожалению, мы не получаем выражение времени компиляции.
Если добавить constexpr будет: prog.cpp:20:48: error: ‘* &<anonymous>.packed_array<int, 5>::data’ is not a constant expression
constexpr auto &&x = make_c_array (1,2,3,4,5).data;
^
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.