用于将args应用于函数的模板函数

时间:2017-11-08 20:38:35

标签: c++ c++11 lambda perfect-forwarding

我尝试编写一个函数(称之为apply_args()),它接受一个特定的函数或函数对象以及用于调用此对象的参数,并使用完美转发来调用它。

示例:

auto fun = [](std::string a, std::string const& b) { return a += b; };

std::string s("world!");

// s is passing by lvalue ref,
// temporary object by rvalue ref 
s = apply_args(fun, std::string("Hello, "), s);

我该如何实现该功能?

2 个答案:

答案 0 :(得分:3)

reloadData()

答案 1 :(得分:0)

如果您接受将fun lambda作为+fun传递(在函数指针中进行转换),我想您可以简单地将apply_args()写为

template <typename R, typename ... Fts, typename ... As>
R apply_args (R(*fn)(Fts...), As && ... as)
 { return fn(std::forward<As>(as)...); }

完整的例子

#include <string>
#include <iostream>
#include <functional>

template <typename R, typename ... Fts, typename ... As>
R apply_args (R(*fn)(Fts...), As && ... as)
 { return fn(std::forward<As>(as)...); }

int main ()
 {
   auto fun = [](std::string a, std::string const& b) { return a += b; };

   std::string s("world!");

   s = apply_args(+fun, std::string("Hello, "), s);

   std::cout << s << std::endl;
 }