Описание тега fold-expression
Выражения fold, начиная с C++17, используются для сокращения пакетов параметров вариативных шаблонов по сравнению с бинарным оператором.
1
ответ
Распаковка переменных-кортежей в C++17
Есть ли что-нибудь лучше в C++17 (может быть, C++2a), чем классический C++14 способ распаковать переменную кортеж с std::index_sequence? Что-нибудь лучше, чем это: template <typename ...I> class MultiIterator { public: MultiIterator(I const&am…
26 янв '18 в 15:27
0
ответов
Существуют ли гарантии сложности компиляции расширения пакета параметров с использованием выражений свертки
Я могу представить себе простую эффективную реализацию раскрытия выражений сгиба, когда все типы пакетов параметров одинаковы (упрощенный пример C++11): #include <type_traits> #include <array> template <bool...> struct bool_pack { …
11 мар '17 в 13:14
1
ответ
Как использовать выражение сгиба с определенным типом?
У меня есть функция, чтобы проверить, если std::string содержит подстроку Я передаю струны как std::string_view, так что копия не имеет места. bool containsSubstr(std::string_view str, std::string_view substr) { return str.find(substr) != std::strin…
19 мар '18 в 13:05
1
ответ
Являются ли выражения сгиба функцией C++14 или C++1z?
https://isocpp.org/std/the-standard заявляет, что рабочий проект N4296 содержит стандарт C++14 плюс незначительные редакционные изменения. Я отметил, что N4296 §5.1.3 содержит спецификацию "Fold выражения". Я думал, что это особенность, которая не …
02 апр '16 в 18:09
3
ответа
Можно ли вставить дополнительную операцию в выражение сгиба?
В C++17 доступно сложенное выражение, поэтому для вывода аргументов мы могли бы использовать template<typename ...Args> void output_argus(Args&&... args) { (cout << ... << args) << EOL; } int main() { output_argus(1, …
08 ноя '18 в 22:16
3
ответа
Проверьте, все ли элементы равны с C++17 fold-выражением
У меня есть функция, принимающая пакет с переменными параметрами, и в начале я хочу проверить, чтобы все элементы сравнивались одинаково. Могу ли я каким-то образом использовать новые C++17 складные выражения, чтобы кратко написать это как одностроч…
18 окт '17 в 08:53
1
ответ
Как определить наличие параметра данного типа в списке аргументов переменной функции и действовать после обработки всех параметров
У меня есть следующее operator<<() перегрузка для моего класса с C++17 сгибов: template <typename... Args> ostream& operator <<(Args&&... args) { //Currently: return (m_osCout << ... << args); //What I need:…
10 янв '19 в 23:11
2
ответа
Можете ли вы использовать подвыражение в выражениях сгиба?
Является ли следующее выражение законным сгибом? template <std::size_t N, std::size_t... Ix> bool in_range(std::index_sequence<Ix...>) { return ((Ix < N) && ...); } Компилируется с Clang, но не GCC
17 ноя '15 в 02:59
2
ответа
Перечисление по кратному выражению
У меня есть некоторый вспомогательный код, который выполняет перестановку векторов, используя индексы времени компиляции. Крайне важно, чтобы сгенерированный код был максимально эффективным. Я полагаюсь на пакеты параметров с выражениями свертывания…
19 янв '19 в 15:08
1
ответ
Сложить выражение в присваивании
Я пытаюсь использовать выражение сгиба для упрощения кода. В следующем коде я пытаюсь вставить элементы в массив, но выражение сгиба не компилируется struct test { std::string cmd[20]; test() { int i = 0; auto insert = [&](auto... c) { assert(i …
02 мар '19 в 06:34
2
ответа
Ассоциативность фолд-выражений
N4191 предложил сложение выражений в C++. Определение там было (args + ...) это левый сгиб (т.е. (((a0 + a1) + a2) + ...) и что (... + args) вправо (т.е. (... + (a8 + (a9 + a10))), Однако пересмотренный документ N4295 отменил определения левого и п…
02 фев '16 в 20:28
1
ответ
C++17: использование integer_sequence с ошибкой компиляции
Я хочу использовать integer_sequence, чтобы судить, находится ли диапазон чисел под определенным значением: is_range() вернет true, иначе вернет false, как показано ниже: #include<utility> #include<iostream> using namespace std; template…
13 июл '16 в 03:56
1
ответ
C++17 кратное выражение точка продукт просто
Я хочу заменить старую мета-рекурсивную функцию на выражение сгиба, мета-функция ниже - это скалярное произведение Как мне заменить этот следующий код, чтобы сложить выражение? constexpr static auto result = Head1 * Head2 + DotProduct<List<Tai…
19 июл '18 в 15:49
1
ответ
GCC распаковывает (я <...) складываю выражение неправильно
Я открыл ошибку в GCC, но я хотел бы знать, правильно ли я оправдываю свои ожидания. Рассмотрите это предложение и следующее складное выражение: (args < ...) Это должно быть эквивалентно: ((args$0 < args$1) < ...) < args$n Рассмотрим сле…
11 июн '16 в 15:20
1
ответ
Как выражения сгиба используются при частичном упорядочении ограничений?
§14.10.3 Частичное упорядочение по ограничениям [temp.constr.order] N4553 указывает, что выражения ограничений, сформированные из понятий и логических операторов, должны быть частично упорядочены и использованы для выбора наилучшей жизнеспособной фу…
17 янв '16 в 21:12
2
ответа
C++17 кратное выражение в cout
Я изучаю новое C++17-кратное выражение и увидел этот код из C++17-кратного выражения. Я хотел бы знать, почему этот код работает: template<typename ...Args> void printer(Args&&... args) { (std::cout << ... << args) <<…
29 авг '16 в 10:22
1
ответ
Ошибка "Неинициализированная захваченная ссылка" при использовании лямбда-выражения в выражении сгиба - clang vs gcc
Рассмотрим следующий код: template <typename F, typename X0, typename X1, typename... Xs> auto fold_left(F&& f, X0&& x0, X1&& x1, Xs&&... xs) { auto acc = f(x0, x1); return ([&](auto y){ return acc = f(acc, …
19 апр '17 в 14:44
2
ответа
Расширение пакета параметров в лямбда с выражением сгиба - gcc vs clang
Учитывая следующий фрагмент кода: template <typename TF> void post(TF){ } template <typename... TFs> struct funcs : TFs... { funcs(TFs... fs) : TFs{fs}... { } void call() { (post([&]{ static_cast<TFs&>(*this)(); }), ...); }…
22 ноя '16 в 22:10
3
ответа
Clang и бинарные выражения сгиба - проклятие пустого пакета параметров
В частности, Clang 3.6.0, который в настоящее время размещается в Coliru. Все эти фрагменты вызваны из: int main() { foo(); std::cout << "\n----\n"; foo(1, 2, 3); } Следующий код: template <class... Args> void foo(Args... args) { std::co…
12 авг '15 в 18:18
3
ответа
C++ одинарное сгибание справа против одинарного сгиба слева с оператором запятой
Почему одинарная левая складка, разделенная запятыми, дает тот же результат, что и правая? Живой код template<class ...Args> void right_fold(Args... args){ ((std::cout << args),...); } template<class ...Args> void left_fold(Args...…
16 апр '18 в 14:16