Описание тега 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…
0 ответов

Существуют ли гарантии сложности компиляции расширения пакета параметров с использованием выражений свертки

Я могу представить себе простую эффективную реализацию раскрытия выражений сгиба, когда все типы пакетов параметров одинаковы (упрощенный пример C++11): #include <type_traits> #include <array> template <bool...> struct bool_pack { …
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, …
3 ответа

Проверьте, все ли элементы равны с C++17 fold-выражением

У меня есть функция, принимающая пакет с переменными параметрами, и в начале я хочу проверить, чтобы все элементы сравнивались одинаково. Могу ли я каким-то образом использовать новые C++17 складные выражения, чтобы кратко написать это как одностроч…
1 ответ

Как определить наличие параметра данного типа в списке аргументов переменной функции и действовать после обработки всех параметров

У меня есть следующее operator<<() перегрузка для моего класса с C++17 сгибов: template <typename... Args> ostream& operator <<(Args&&... args) { //Currently: return (m_osCout << ... << args); //What I need:…
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 ответа

Перечисление по кратному выражению

У меня есть некоторый вспомогательный код, который выполняет перестановку векторов, используя индексы времени компиляции. Крайне важно, чтобы сгенерированный код был максимально эффективным. Я полагаюсь на пакеты параметров с выражениями свертывания…
1 ответ

Сложить выражение в присваивании

Я пытаюсь использовать выражение сгиба для упрощения кода. В следующем коде я пытаюсь вставить элементы в массив, но выражение сгиба не компилируется struct test { std::string cmd[20]; test() { int i = 0; auto insert = [&](auto... c) { assert(i …
2 ответа

Ассоциативность фолд-выражений

N4191 предложил сложение выражений в C++. Определение там было (args + ...) это левый сгиб (т.е. (((a0 + a1) + a2) + ...) и что (... + args) вправо (т.е. (... + (a8 + (a9 + a10))), Однако пересмотренный документ N4295 отменил определения левого и п…
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 &lt; ...) Это должно быть эквивалентно: ((args$0 &lt; args$1) &lt; ...) &lt; args$n Рассмотрим сле…
11 июн '16 в 15:20
1 ответ

Как выражения сгиба используются при частичном упорядочении ограничений?

§14.10.3 Частичное упорядочение по ограничениям [temp.constr.order] N4553 указывает, что выражения ограничений, сформированные из понятий и логических операторов, должны быть частично упорядочены и использованы для выбора наилучшей жизнеспособной фу…
2 ответа

C++17 кратное выражение в cout

Я изучаю новое C++17-кратное выражение и увидел этот код из C++17-кратного выражения. Я хотел бы знать, почему этот код работает: template&lt;typename ...Args&gt; void printer(Args&amp;&amp;... args) { (std::cout &lt;&lt; ... &lt;&lt; args) &lt;&lt;…
29 авг '16 в 10:22
1 ответ

Ошибка "Неинициализированная захваченная ссылка" при использовании лямбда-выражения в выражении сгиба - clang vs gcc

Рассмотрим следующий код: template &lt;typename F, typename X0, typename X1, typename... Xs&gt; auto fold_left(F&amp;&amp; f, X0&amp;&amp; x0, X1&amp;&amp; x1, Xs&amp;&amp;... xs) { auto acc = f(x0, x1); return ([&amp;](auto y){ return acc = f(acc, …
19 апр '17 в 14:44
2 ответа

Расширение пакета параметров в лямбда с выражением сгиба - gcc vs clang

Учитывая следующий фрагмент кода: template &lt;typename TF&gt; void post(TF){ } template &lt;typename... TFs&gt; struct funcs : TFs... { funcs(TFs... fs) : TFs{fs}... { } void call() { (post([&amp;]{ static_cast&lt;TFs&amp;&gt;(*this)(); }), ...); }…
3 ответа

Clang и бинарные выражения сгиба - проклятие пустого пакета параметров

В частности, Clang 3.6.0, который в настоящее время размещается в Coliru. Все эти фрагменты вызваны из: int main() { foo(); std::cout &lt;&lt; "\n----\n"; foo(1, 2, 3); } Следующий код: template &lt;class... Args&gt; void foo(Args... args) { std::co…
12 авг '15 в 18:18
3 ответа

C++ одинарное сгибание справа против одинарного сгиба слева с оператором запятой

Почему одинарная левая складка, разделенная запятыми, дает тот же результат, что и правая? Живой код template&lt;class ...Args&gt; void right_fold(Args... args){ ((std::cout &lt;&lt; args),...); } template&lt;class ...Args&gt; void left_fold(Args...…
16 апр '18 в 14:16