HLFX.Ru Forum Страницы (3): « 1 [2] 3 »
Показать все 35 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- с++: опять запутался в трёх соснах. (https://hlfx.ru/forum/showthread.php?threadid=4795)


Отправлено ComradeAndrew 23-07-2016 в 05:41:

thambs

Цитата:
thambs писал:
Можно ли добиться поведения аналогичного передаче по ссылке?

Ну передавай указатели. Потому что
no arrays of references

Цитата:
а можно сделать количество однотипных аргументов параметром шаблона?

Не понял что ты хочешь сделать.


Отправлено Дядя Миша 23-07-2016 в 13:42:

Цитата:
ComradeAndrew писал:
Потому что
no arrays of references

К слову сказать подобные ограничения свидетельствуют о непродуманности архитектуры языка в целом. Да и не только языка, а вооббще любого продукта. Интуитивно понятное обучение строится на аналогиях и человек привыкший делать массивы из указателей естественно будет пытаться провернуть подобное и со ссылками. А потом конечно выходят книжки "как делать нельзя". Вообще большинство книжек по крестам учит именно тому чего делать нельзя.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено FiEctro 23-07-2016 в 14:39:

Дядя Миша
ИМХО как делать нельзя должен сообщать компилятор, а не книжки

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!


Отправлено Дядя Миша 23-07-2016 в 14:53:

FiEctro компилятор не подскажет тебе как лучше организовать структуру приложения. Если бы он умел это делать, надобность в программистах отпала бы сама-собой.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 23-07-2016 в 15:57:

FiEctro
Компилятор и сообщает, но все почему-то потом к нам на форум идут, с уточняющими вопросами.

__________________

xaerox on Vivino


Отправлено Дядя Миша 23-07-2016 в 17:27:

Цитата:
XaeroX писал:
но все почему-то потом к нам на форум идут, с уточняющими вопросами.

а наша задача - отредиректить их на три весёлых буквы, на CSM тоесть.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 23-07-2016 в 18:13:

Цитата:
Дядя Миша писал:
отредиректить их на три весёлых буквы, на CSM тоесть.

Как говорил Охлобыстин в известном сериале - на ЭКГ!

__________________

xaerox on Vivino


Отправлено thambs 24-07-2016 в 14:50:

>no arrays of references
Это понятно. Я другое имел ввиду. Сейчас у меня функция выглядит так:

C++ Source Code:
1
template<typename...Is>
2
inline T& operator () (Is...args){
3
  const int 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. Если я правильно понимаю как работает компилятор, то при передаче параметра по ссылке ничего никуда не копируется, а при обращении к соответствующему аргументу просто подставляется его адрес. Соответственно, хотелось бы, что бы шаблон разворачивался во что ни будь типа:
C++ Source Code:
T& operator () (int& arg1, int& arg2, int& arg3, int& arg4)

Можно конечно все случаи написать вручную, но наверняка же можно это высокоуровнево сделать.

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено ComradeAndrew 24-07-2016 в 20:00:

thambs
Так ты хочешь изменять аргументы, беря их по ссылке, или ты так пытаешься "оптимизировать" код?
Если второе, то забудь. Ассемблерный код почти не отличается, особенно когда ты потом кладешь все аргументы в массив под который выделяется память в любом случае. Да и не думай, что ты умнее компилятора и процессора в 2016 году, когда пишешь на плюсах.

Ну если сильно хочется, то можешь сделать так:

C++ Source Code:
template<typename...Ts>
void func (Ts&...args)


Отправлено Дядя Миша 24-07-2016 в 20:08:

Цитата:
ComradeAndrew писал:
Да и не думай, что ты умнее компилятора и процессора в 2016 году

а компилятор што, не люди писали?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 24-07-2016 в 20:15:

Цитата:
ComradeAndrew писал:
Да и не думай, что ты умнее компилятора и процессора в 2016 году, когда пишешь на плюсах.

Забавно, но я слышу эту фразу вот уже 16 лет, в ней меняется только год.
А потом выясняется, что компилятор какой-нибудь 2010-й студии не умеет нормально max скомпилировать, и далее в этом же духе.
Компилятор - он не умный, он педантичный. В том смысле, что не может сделать ошибку по невнимательности, что характерно для человека. В остальном же - дуб дубом.

__________________

xaerox on Vivino


Отправлено ComradeAndrew 24-07-2016 в 20:45:

Цитата:
Дядя Миша писал:
а компилятор што, не люди писали?

Где я такое сказал?

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; }; // Лямба-функция
7
  if (sizeof...(args))
8
    std::initializer_list<int>({ (add(args), 0)... });
9
  return s;
10
}


Отправлено XaeroX 24-07-2016 в 20:55:

ComradeAndrew
Я не говорю - всё бросить и оптимизировать. Я предлагаю избегать пессимизации, понадеявшись на мудрость компилятора. Некоторые этим грешат, увы.

__________________

xaerox on Vivino


Отправлено Дядя Миша 24-07-2016 в 21:18:

Цитата:
ComradeAndrew писал:
Где я такое сказал?

Ты - нигде. Поэтому я тебя и спросил.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено thambs 24-07-2016 в 21:27:

А можешь пояснить (или лучше кинуть статьёй) как вот эта распаковка работает?

C++ Source Code:
std::initializer_list<int>({ (add(args), 0)... });
//Конкретно, не понятно, для чего 0 в (add(args), 0) и как вообще подскобочное выражение работает.

В курсе по которому язык учил, как то их обошли стороной, а самостоятельно до сих пор не понял как это работает.

__________________
http://www.moddb.com/mods/monorail-quest


Временная зона GMT. Текущее время 16:57. Страницы (3): « 1 [2] 3 »
Показать все 35 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024