-1

使用下面的类,我希望能够创建一个指定的实例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;
}
4

2 回答 2

1

很简单。只需添加参数名称。

R call(Args... args) {
    return func(args...);
}
于 2018-03-20T17:27:03.003 回答
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应该是 astruct或 make something public; typedefinmain()是错误的)但以下更正的代码使用我的 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;
 }
于 2018-03-20T17:26:33.430 回答