使用下面的类,我希望能够创建一个指定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(/* ? */);
}
};
E.g:
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;
}
答案 0 :(得分:1)
很简单。只需添加参数名称。
R call(Args... args) {
return func(args...);
}
答案 1 :(得分:0)
简化
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;
}