Как распространить неопределенное количество аргументов шаблона?
Используя следующий класс, я хотел бы иметь возможность создать экземпляр указанного 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;
}