如何传播未定义数量的模板参数?

时间:2018-03-20 17:24:04

标签: c++ c++11 templates variadic-templates multiple-arguments

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

简化

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

如果Args...类型为intlongfloat以及其他不支持移动语法的简单类型,这应该可以正常工作。

如果你想添加完美转发,那就像

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;
 }