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}) |
что бы оно при компиляции развернулось в
C++ Source Code:
Как такое можно организовать?__________________
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); |
4 | template<ptype T> void until_ptype_end() |
7 | until_ptype_end<static_cast<ptype>(T+1)>(); |
9 | template<> void until_ptype_end<TYPE_END>() {} |
И вызываем вот так:
C++ Source Code:
until_ptype_end<TYPE1>(); |
Этот код корректно работает и со специализациями foo. Но есть ограничение: элементы енума должны быть последовательными (т.к. доступ к следующему вычисляется как предыдущий + 1).__________________
Отправлено thambs 17-08-2016 в 21:20:
Блин, или я идиот, или одно из двух... Сделал две реализации -- одну на шаблонах, а другую на статичных массивах с указателями на функции. Казалось бы, что шаблоны развернутся прямо в нужные функции, и это будет быстрее чем обращаться через обёртку -- но нет, через обёртку процентов на 10% быстрее. wat?
__________________
http://www.moddb.com/mods/monorail-quest