c 11:模板化包装功能

c 11:模板化包装功能,第1张

概述我尝试创建一个通用包装函数,它将任何函数作为参数以及它们的参数.就像std :: thread构造函数一样. 我目前的代码是: #include <iostream>using namespace std;template<typename FUNCTION, typename... ARGS>void wrapper(FUNCTION&& func, ARGS&&... args){ 我尝试创建一个通用包装函数,它将任何函数作为参数以及它们的参数.就像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,functor或只是“普通”函数).但我也想返回它的返回值.

这应该与删除的return语句一起使用,但不幸的是我不知道如何声明包装函数返回类型.

我尝试了很多东西(例如使用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,4);    cout << "WRAPPERS RES IS: " << wrapper(dummy,4) << endl;}

我认为代码应该工作,除了???.

谢谢你的任何想法

问候
凯文

解决方法 使用 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;}
总结

以上是内存溢出为你收集整理的c 11:模板化包装功能全部内容,希望文章能够帮你解决c 11:模板化包装功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1236277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存