Nano Hash - криптовалюты, майнинг, программирование

Лямбда-расширение шаблона Variadic

Я пытаюсь реализовать класс делегата, следуя примеру Херба Саттера. В этой статье есть разделы, дублирующие несколько шаблонов; один шаблон для количества аргументов в списке (пример 7, строки 41-59)1. Я пытаюсь заменить это вариативным шаблоном.

void operator()() const {
    for_each(begin(l_), end(l_), []( function<F> i) {
            i(); 
    });
}

template<typename... Ts>
    void operator()(Ts... vs) const {
        for_each(begin(l_), end(l_), [&, vs...]( function<F> i) //g++-4.6.1: expected ',' before '...' token; expected identifier before '...' token
        { 
                i(vs...);
        });
    }

Я нашел этот ответ, но я думаю, что моя проблема в том, что vs не расширяется. Каков правильный способ сделать это?


  • Это неправильная идиома для функций пересылки. Что вы хотите, так это взять ваши параметры как (Ts&& ...vs), а затем передать их функции как i(std::forward(vs)...). Это, вероятно, не решит вашу проблему, но именно так выполняется идеальная переадресация в С++ 11. 25.03.2012
  • Я могу не понять вашу точку зрения, но я не хочу двигать аргументы. Копия в данном случае - самое то. Каждый обратный вызов получает копию аргументов события. Может быть случай, когда семантика перемещения будет работать, но копирование является более общим. Верно? 25.03.2012
  • Пересылка будет перемещать или копировать аргументы по мере необходимости. Идея идеальной переадресации заключается в том, что она идеальна: идентична тому, как вы вызываете i напрямую. Поэтому, если i принимает свои аргументы по значению, а вы передаете lvalue, оно будет скопировано. Если вы передадите значение r, оно будет перемещено, что в точности произойдет, если вы вызовете i напрямую. Если пользователь хочет перейти к параметру функции, вы не можете (и не должны) его останавливать. Это их дело. Все, о чем вам нужно беспокоиться, это идеальная пересылка аргументов, и для этого используется синтаксис C++11. 25.03.2012
  • Это очень полезно. Благодарю вас! 25.03.2012

Ответы:


1

Похоже, это старая ошибка gcc, которая все еще сохраняется. Возможно, захочется дружески подтолкнуть сопровождающих.

Обходной путь может быть:

#include <vector>
#include <algorithm>
#include <functional>
#include <tuple>

using namespace std;

template<typename F>
struct Foo {
  template<typename... Ts>
  void operator()(Ts... vs) const {
    auto t = tie(vs...);

    for_each(begin(l_), end(l_), 
             [&t]( function<F> i) 
             { 
               // figure out the function arity and unpack the tuple
               // onto it. This is could be more difficult than one
               // thinks.

               // i(vs...);
             }
      );
  }
  vector< function< F > > l_;
};
25.03.2012
  • Спасибо, я удалил лямбду: template<typename... Ts> void operator()(Ts... vs) const { for(auto i = begin(l_); i != end(l_); ++i) { (*i)(vs...); } } 25.03.2012
  • Вы все еще можете улучшить это, используя auto i : l_ :) 25.03.2012

  • 2

    Я не уверен, почему vs не расширяется, но, возможно, простой обходной путь - передать аргументы по значению по умолчанию и назвать известные объекты, требующие передачи по ссылке. Таким образом, расширение в списке захвата не требуется. Лично я не удивлюсь, если это ошибка в gcc (ваш пример неполный, иначе я бы попробовал его с последними версиями SVN gcc и clang).

    25.03.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..