在 C++ 泛型编程中处理 void 赋值

2024-05-27

我有 C++ 代码,它包装任意 lambda 并返回 lambda 的结果。

template <typename F>
auto wrapAndRun(F fn) -> decltype(F()) {
    // foo();
    auto result = fn();
    // bar();
    return result;
}

这有效,除非F回报void (error: variable has incomplete type 'void')。我想用一个ScopeGuard to run bar,但我不想bar运行如果fn抛出。有任何想法吗?

附:后来我发现有解决这种不一致的提案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0146r1.html.


您可以编写一个简单的包装类来处理这一部分:

template <class T>
struct CallAndStore {
    template <class F>
    CallAndStore(F f) : t(f()) {}
    T t;
    T get() { return std::forward<T>(t); }
};

并专攻:

template <>
struct CallAndStore<void> {
    template <class F>
    CallAndStore(F f) { f(); }
    void get() {}
};

您可以通过小型工厂函数来提高可用性:

template <typename F>
auto makeCallAndStore(F&& f) -> CallAndStore<decltype(std::declval<F>()())> {
    return {std::forward<F>(f)};
}

然后使用它。

template <typename F>
auto wrapAndRun(F fn) {
    // foo();
    auto&& result = makeCallAndStore(std::move(fn));
    // bar();
    return result.get();
}

编辑:与std::forward铸入内部get,这似乎也可以正确处理从函数返回的引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 泛型编程中处理 void 赋值 的相关文章

随机推荐

  • cygwin $'\r':命令未找到错误

    我稍微修改了一个项目 在调试下它运行得很好 当我尝试在不调试的情况下构建它时 它显示错误 无法修复它 make Making all in third party make 1 Entering directory cygdrive c U
  • 如何在角度2中动态地在输入框上添加工具提示

    我有一个输入框 我想在将鼠标悬停在输入框上时显示工具提示消息 这将基于我们从服务获得的响应 如果服务响应为 true 则工具提示中的消息将为 true message 如果服务返回 false 则该消息将为 false message 这是
  • 签名仅对临时无效

    我不确定我的临时项目发生了什么变化 但在尝试安装时出现此错误 应用程序未通过协同设计验证 签名无效 或者不是用Apple提交证书签名的 19011 设备调试构建良好 与我的临时配置文件关联的证书直到 2011 年才会过期 我搜索了 Goog
  • DateTimeFormat.AbbreviatedMonthNames 在月份名称末尾添加一个点

    昨晚 我们将 Web 服务层从物理 Windows 2008 r2 迁移到虚拟 Windows 2012 我们的日志中收到大量有关 DateTime 无效格式的事件 这很奇怪 因为我们仔细检查了区域设置 长话短说 CultureInfo G
  • 使用 node.js 上的 knox 将八位字节流从请求流式传输到 S3

    我正在尝试使用以下命令将八位字节流直接流式传输到 S3knox https github com LearnBoost knox 在 Node js 上 octet stream 是从浏览器上传的 XHR 文件 我以为我可以将请求流式传输到
  • 无法通过 macvlan 网络从主机访问 docker 容器

    在我的 Linux 网络中 我无法通过专用 macvlan 网络从运行它们的主机访问我的 docker 容器 到此 macvlan 网络的所有其他连接都正常 所以基本上设置是 DOCKER1 eth0 172 0 0 1 default e
  • Php 会话标头已经发送错误[重复]

    这个问题在这里已经有答案了 可能的重复 php 标头已发送错误 https stackoverflow com questions 3319207 php headers already sent error 我已附上我的代码 该代码用于
  • 在哪里可以找到将现有 CPAN 模块转换为使用 Dist::Zilla 的简明指南?

    我曾多次阅读过相关文档和一些博客文章地区 齐拉 http search cpan org dist Dist Zilla 我从来没有对自己的理解充满信心 在回答另一个问题时 Ether 提出了转换的可能性地穴 SSLeay http sea
  • 淡出图像上的文字

    我知道如何使用 CSS 透明渐变淡出纯色背景上的文本 但是如何才能淡出图像背景上的文本呢 这是我想要的一个例子 注意 我需要像图像一样的静态效果 而不是动态过渡 CSS mask image可能是您正在寻找的 div background
  • 单击按钮滚动到特定 div

    我有一个具有固定菜单和内容框 div 的页面 单击菜单时 内容框滚动到特定 div 到目前为止 一切都很好 这是这里的示例 https jsfiddle net ezrinn 8cdjsmb9 11 https jsfiddle net e
  • Siri - 联系人搜索行为类似于 Skype 的音频通话

    我正在实现一个 VoIP 应用程序 我需要通过 Siri 发起呼叫 我能够通过 Siri 发起呼叫 但问题是 每次启动应用程序时 尽管联系人不在应用程序的联系人列表中 我不知道如何以及在哪里处理这个问题 我的意思是 如果应用程序没有像 Sk
  • CGAL:如何有效计算多面体的面面积?

    我有一个多面体 其面是三角形 我知道在 CGAL 中 Triangle 3 类提供了 squared area 方法 通过它我们可以计算三角形的面积 有什么方法可以将其应用到多面体方面吗 或者关于如何计算每个面的面积有什么想法吗 这是一个例
  • 在 C++ 中是否有更好的方法一次性执行一组代码而不是使用静态变量检查

    在很多地方我都有一次性初始化的代码 如下所示 int callback method void userData This piece of code should run one time only static int init fla
  • 如何指定消息是否应显示在 p:growl 或 p:messages 中?

    在我的 Facelets 页面中 我有这个
  • 如何使用 facebook 用户登录我的网站?

    我想知道 facebook 如何让用户登录我们的网站 我的意思是用户需要注册到我的网站才能发表评论 我如何通过我的 php 代码检查它是否是登录用户 我听说你只能用javascript检查它是否是登录用户 感谢您的任何解释 您可以使用脸书
  • C3P0:生产中未返回的连接超时?

    参数unreturnedConnectionTimeout给定时间段后未返回的连接超时 我正在尝试决定是否应该在我的制作中使用它persistence xml 使用它的一大优点是连接池将能够从泄漏的连接中恢复 一个很大的缺点是泄漏的连接将很
  • 在 bootstrap-table 中添加链接

    我想添加一个指向某个列的链接引导表 http wenzhixin net cn p bootstrap table 这个怎么做 在您的 HTML 表中 th Computer th 在你的 JavaScript 中 function Lin
  • 计算距离早上 8 点还有多少小时

    我知道如何计算两个日期之间的差异 但如何计算给定日期与下一个上午 8 点之间的时间 var now DateTime Now var tomorrow8am now AddDays 1 Date AddHours 8 double tota
  • 在 flutter 中创建图像蒙版

    Flutter 提供了多种基于路径 即剪辑路径 的遮罩方法 我正在尝试找出一种方法 可以拍摄具有透明层的图像 如下例所示 并使用该图像来掩盖另一个图像 视图或作为通用蒙版 我的第一直觉是看自定义Paint类 https api flutte
  • 在 C++ 泛型编程中处理 void 赋值

    我有 C 代码 它包装任意 lambda 并返回 lambda 的结果 template