首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++11:模板包装函数

c++11:模板包装函数
EN

Stack Overflow用户
提问于 2014-08-25 22:44:04
回答 2查看 1.6K关注 0票数 6

我试图创建一个通用的包装函数,它接受任何函数作为参数以及它们的参数。就像std::thread构造函数一样。

我目前的代码是:

代码语言:javascript
运行
复制
#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),但都没有效果。我现在的问题是,我是如何运行以下代码的?

代码语言:javascript
运行
复制
#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;
}

除了???之外,我认为代码应该可以工作。

谢谢你的任何想法

问候凯文

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-25 22:46:25

使用std::result_of

代码语言:javascript
运行
复制
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别名:

代码语言:javascript
运行
复制
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)...);
}

或者可以使用返回类型扣减:

代码语言:javascript
运行
复制
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;
}
票数 14
EN

Stack Overflow用户

发布于 2014-08-25 22:50:30

您可以将decltype与C++11自动尾随返回类型一起使用:

代码语言:javascript
运行
复制
template<typename FUNCTION, typename... ARGS>
auto wrapper(FUNCTION&& func, ARGS&&... args) -> decltype(func(std::forward<ARGS>(args)...))

Live demo

C++14中,只需:

代码语言:javascript
运行
复制
template<typename FUNCTION, typename... ARGS>
decltype(auto) wrapper(FUNCTION&& func, ARGS&&... args)

Live demo

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25495448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档