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 25-07-2016 в 06:14:

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

Ну я как правило все ответы нахожу на stackoverflow.com и en.cppreference.com.
В данном случае это все написано тут и тут.

Если коротко, то распаковка варьируемых аргументов может происходить только в конструкции list-initializer. В моем примере я использую лямда функцию в которую распаковываются аргументы и она ничего не возвращает, поэтому и дописываю 0 в список инициализации, через запятую. И получаю такую конструкцию:
C++ Source Code:
{ (add(args), 0)... } // ... - для распаковки

Соответственно я эту конструкцию должен использовать только там, где применяется list-initializer. Например как аргумент для std::initializer_list.
Это может быть и объявление массива, вроде int a[] = { args... };
Ну я думаю суть ты понял.


Отправлено thambs 25-07-2016 в 08:37:

ComradeAndrew
Спасибо, вот что, собственно, я искал:

C++ Source Code:
for (const auto& arg : {Args...})

Совсем позабыл по циклы по массивам. Надеюсь, что конпелятор такой цикл оптимизирует, и всё будет так же быстро как в фортране...

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


Отправлено thambs 16-08-2016 в 03:08:

Вопрос про шаблоны. Пусть есть шаблон функции параметризуемый параметром:

C++ Source Code:
enum ptype {TYPE1, TYPE2, TYPE3};
template<ptype T> void foo(void);

Очень хочется сделать конструкцию в стиле
C++ Source Code:
for(const auto T: {TYPE1, TYPE2, TYPE3})
  foo<T>();

что бы оно при компиляции развернулось в
C++ Source Code:
foo<TYPE1>();
foo<TYPE2>();
foo<TYPE3>();

Как такое можно организовать?

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


Отправлено XaeroX 16-08-2016 в 08:02:

thambs
Например, вот так:

C++ Source Code:
1
enum ptype { TYPE1, TYPE2, TYPE3, TYPE_END };
2
template<ptype T> void foo(void);
3
 
4
template<ptype T> void until_ptype_end()
5
{
6
  foo<T>();
7
  until_ptype_end<static_cast<ptype>(T+1)>();
8
}
9
template<> void until_ptype_end<TYPE_END>() {}

И вызываем вот так:
C++ Source Code:
until_ptype_end<TYPE1>();

Этот код корректно работает и со специализациями foo. Но есть ограничение: элементы енума должны быть последовательными (т.к. доступ к следующему вычисляется как предыдущий + 1).

__________________

xaerox on Vivino


Отправлено thambs 17-08-2016 в 21:20:

Блин, или я идиот, или одно из двух... Сделал две реализации -- одну на шаблонах, а другую на статичных массивах с указателями на функции. Казалось бы, что шаблоны развернутся прямо в нужные функции, и это будет быстрее чем обращаться через обёртку -- но нет, через обёртку процентов на 10% быстрее. wat?

__________________
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