我试图创建一个通用的包装函数,它接受任何函数作为参数以及它们的参数。就像std::thread构造函数一样。
我目前的代码是:
#include <iostream>
using namespace std;
template<typename FUNCTION, typename... ARGS>
void wrapper(FUNCTION&& func, ARGS&&... args)
{
cout << "WRAPPER: BEFORE" << endl;
auto res = func(args...);
cout << "WRAPPER: AFTER" << endl;
//return res;
}
int dummy(int a, int b)
{
cout << a << '+' << b << '=' << (a + b) << endl;
return a + b;
}
int main(void)
{
dummy(3, 4);
wrapper(dummy, 3, 4);
}包装器函数本身可以工作。它用给定的参数调用给定的函数对象(std::function、函子或仅仅是一个“正常”函数)。但我也喜欢返回它的返回值。
这应该适用于已删除的return-statement,但不幸的是,我不知道如何声明包装函数返回类型。
我尝试了很多事情(例如用decltype),但都没有效果。我现在的问题是,我是如何运行以下代码的?
#include <iostream>
template<typename FUNCTION, typename... ARGS>
??? wrapper(FUNCTION&& func, ARGS&&... args)
{
cout << "WRAPPER: BEFORE" << endl;
auto res = func(args...);
cout << "WRAPPER: AFTER" << endl;
return res;
}
int dummy(int a, int b)
{
cout << a << '+' << b << '=' << (a + b) << endl;
return a + b;
}
int main(void)
{
dummy(3, 4);
cout << "WRAPPERS RES IS: " << wrapper(dummy, 3, 4) << endl;
}除了???之外,我认为代码应该可以工作。
谢谢你的任何想法
问候凯文
发布于 2014-08-25 22:46:25
使用std::result_of
template <typename F, typename ...Args>
typename std::result_of<F &&(Args &&...)>::type wrapper(F && f, Args &&... args)
{
return std::forward<F>(f)(std::forward<Args>(args)...);
}在C++14中,您可以使用result_of_t别名:
template <typename F, typename ...Args>
std::result_of_t<F &&(Args &&...)> wrapper(F && f, Args &&... args)
{
return std::forward<F>(f)(std::forward<Args>(args)...);
}或者可以使用返回类型扣减:
template <typename F, typename ...Args>
decltype(auto) wrapper(F && f, Args &&... args)
{
std::cout << "before\n";
auto && res = std::forward<F>(f)(std::forward<Args>(args)...);
std::cout << "after\n";
return res;
}发布于 2014-08-25 22:50:30
您可以将decltype与C++11自动尾随返回类型一起使用:
template<typename FUNCTION, typename... ARGS>
auto wrapper(FUNCTION&& func, ARGS&&... args) -> decltype(func(std::forward<ARGS>(args)...))Live demo
在C++14中,只需:
template<typename FUNCTION, typename... ARGS>
decltype(auto) wrapper(FUNCTION&& func, ARGS&&... args)Live demo
https://stackoverflow.com/questions/25495448
复制相似问题