将 args 应用于函数的模板函数
Template function for applying args to function
我正在尝试编写一个函数(称之为 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);
如何实现该功能?
如果您接受将 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;
}
template <typename Func, typename ...Args>
decltype(auto) apply_args(Func &&f, Args &&...args) {
return f(std::forward<Args>(args)...);
}
我正在尝试编写一个函数(称之为 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);
如何实现该功能?
如果您接受将 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;
}
template <typename Func, typename ...Args>
decltype(auto) apply_args(Func &&f, Args &&...args) {
return f(std::forward<Args>(args)...);
}