Как распространить неопределенное количество аргументов шаблона?

Используя следующий класс, я хотел бы иметь возможность создать экземпляр указанного Foo() хранить и вызывать функцию, но как я могу передать необходимые аргументы в функцию call?

template<class R, class... Args> struct Foo {
    std::function<R(Args...)> func;

    Foo(const std::function<R(Args...)> &funcIn) : func(funcIn) {}

    R call(Args...) {
        return func(/* ? */);
    }
};

Например:

int main() {
    typedef typename Foo<int(int)> Bar;
    Bar x([](int y, int z){return y + z + 2;});
    std::cout << x.call(12, 7);
    return 0;
}

2 ответа

Это просто. Просто добавьте имя аргумента.

R call(Args... args) {
    return func(args...);
}

Чтобы сделать это простым

R call (Args... as) {
    return func(as...);
}

Это должно хорошо работать, если Args... типы int, long, float и другие простые типы без поддержки синтаксиса перемещения.

Если вы хотите добавить идеальную пересылку, что-то как

template <typename ... As>
R call (As && ... as) {
    return func(std::forward<As>(as)...);
}

--- РЕДАКТИРОВАТЬ ---

Если я правильно понимаю (?) В соответствии со Smit Ycyken, этот код даже не компилируется.

Есть некоторые ошибки в исходном коде OP (class Foo должен быть struct или сделать что-то public; typedef в main() неправильно) но следующий исправленный код компилируется с моим g++ и моим clang++

#include <iostream>
#include <functional>

template<class R, class... Args> struct Foo {
    std::function<R(Args...)> func;

    Foo(const std::function<R(Args...)> &funcIn) : func(funcIn) {}

    R call (Args... as) {
       return func(as...);
    }
};

int main ()
 {
   typedef Foo<int, int, int> Bar;
   Bar x([](int y, int z){return y + z + 2;});
   std::cout << x.call(12, 7);
   return 0;
 }
Другие вопросы по тегам