ComradeAndrew писал: Потому что
no arrays of references
К слову сказать подобные ограничения свидетельствуют о непродуманности архитектуры языка в целом. Да и не только языка, а вооббще любого продукта. Интуитивно понятное обучение строится на аналогиях и человек привыкший делать массивы из указателей естественно будет пытаться провернуть подобное и со ссылками. А потом конечно выходят книжки "как делать нельзя". Вообще большинство книжек по крестам учит именно тому чего делать нельзя.
Дядя Миша
ИМХО как делать нельзя должен сообщать компилятор, а не книжки
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro компилятор не подскажет тебе как лучше организовать структуру приложения. Если бы он умел это делать, надобность в программистах отпала бы сама-собой.
>no arrays of references
Это понятно. Я другое имел ввиду. Сейчас у меня функция выглядит так:
C++ Source Code:
1
template<typename...Is>
2
inline T& operator () (Is...args){
3
constint n_args = sizeof...(args);
4
int xs[n_args] = {((int)args)...};
5
int i = 0; for(int n=0; n<n_args; n++) i += xs[n] * helper[n];
6
return data[i];
7
}
т.е. сначала аргументы копируются в args, потом из args повторно копируются в xs. Если я правильно понимаю как работает компилятор, то при передаче параметра по ссылке ничего никуда не копируется, а при обращении к соответствующему аргументу просто подставляется его адрес. Соответственно, хотелось бы, что бы шаблон разворачивался во что ни будь типа:
thambs
Так ты хочешь изменять аргументы, беря их по ссылке, или ты так пытаешься "оптимизировать" код?
Если второе, то забудь. Ассемблерный код почти не отличается, особенно когда ты потом кладешь все аргументы в массив под который выделяется память в любом случае. Да и не думай, что ты умнее компилятора и процессора в 2016 году, когда пишешь на плюсах.
ComradeAndrew писал: Да и не думай, что ты умнее компилятора и процессора в 2016 году, когда пишешь на плюсах.
Забавно, но я слышу эту фразу вот уже 16 лет, в ней меняется только год.
А потом выясняется, что компилятор какой-нибудь 2010-й студии не умеет нормально max скомпилировать, и далее в этом же духе.
Компилятор - он не умный, он педантичный. В том смысле, что не может сделать ошибку по невнимательности, что характерно для человека. В остальном же - дуб дубом.
Дядя Миша писал: а компилятор што, не люди писали?
Где я такое сказал?
XaeroX
Ну давайте тут вручную высокоуровневый код оптимизировать.
Ты правда считаешь, что на это стоит тратить время? Которое, кстати, можно потратить на оптимизацию самих алгоритмов и представления данных.
thambs
Кстати, раз уж пишешь на плюсах, то можешь использовать такую распаковку, когда надо для каждого аргумента одно и тоже сделать:
C++ Source Code:
1
#include <initializer_list>
2
3
template<typename...Is>
4
int sum (Is&...args) {
5
int s = 0;
6
auto add = [&s](int arg) { s+=arg; }; // Лямба-функция
ComradeAndrew
Я не говорю - всё бросить и оптимизировать. Я предлагаю избегать пессимизации, понадеявшись на мудрость компилятора. Некоторые этим грешат, увы.