如何根据模板参数有条件地声明局部变量?

2023-11-25

我想根据模板 bool 参数有条件地在函数中声明局部变量。因此,如果这是真的,它应该在那里,否则不应该在那里,因为我不希望该变量在堆栈上分配内存或调用其构造函数。它也可以是基本类型。

我无法在 constexpr if 块中声明它,因为我需要用法之间的持久性。

  1. 我可以声明变量并添加[[maybe_unused]]。那么,是否有编译器优化保证不为变量分配内存呢?

    template <bool T> void foo()
    {
        [[maybe_unused]] SomeLargeClass x;
        if constexpr(T)
        {
            /* ... do something with x */
        }
        /* ... do something without x */
        if constexpr(T)
        {
            /* ... do something more with x */
        }
    }
    
  2. 我尝试将声明替换为

    std::enable_if_t<T, SomeLargeClass> x;
    

    但它不起作用,因为T==falsecase 无法提供类型。为什么这不是SFINAE?

  3. 我还有其他选择吗?


假设规则可能会丢弃未使用的SomeLargeClass,但如果该类进行分配,情况会更复杂。 一种简单的权衡是使用std::conditional并有SomeLargeClass需要时,以及其他情况下的一些虚拟小班;

struct Dummy
{
    // To be compatible with possible constructor of SomeLargeClass
    template <typename ...Ts> Dummy(Ts&&...) {} 
};

template <bool B> void foo()
{
    [[maybe_unused]] std::conditional_t<B, SomeLargeClass, Dummy> x;
    if constexpr(B) {
        // ... do something with x
    }
    // ... do something without x
    if constexpr(B) {
        // ... do something more with x
    }
}

作为替代方案,您可以重写您的函数,使您的类仅位于 constexpr 块中:

template <bool B> void foo()
{
    const auto do_something_without_x = [](){
        // ... do something without x
    };
    if constexpr(B) {
        SomeLargeClass x;
        // ... do something with x
        do_something_without_x();
        // ... do something more with x
    } else {
        do_something_without_x();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据模板参数有条件地声明局部变量? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 故事板中新视图控制器的类

    在我的故事板中 我拖动了一个新的视图控制器 我的故事板现在有两个视图控制器 一个是我创建文件时出现的主视图控制器 另一个是拖动的视图控制器 当我进入 助理编辑器 并选择主视图控制器时 我得到了 ViewController h 类 但是当我
  • 不使用 string.Split 分割字符串

    我正在做一个家庭作业问题来分割字符串而不使用框架方法 以下是我想出的工作代码 我想知道如何将运行时间提高到O n 也欢迎任何改进建议 public static string split string txt char delim char
  • 在 Mac OS X 上加载 JNI 库?

    背景 所以我尝试加载 jnilib 特别是JOGL 在运行时转换为 Mac OS X 上的 Java 我一直在关注相关的 Stack Overflow 问题 Maven 和 JOGL 库 在 Java 中加载 DLL Eclipse JNI
  • 使用 Tesseract 进行页面布局分析?

    超立方体3能够执行页面布局分析 但是 我找不到任何有关如何使用该库实现此类目的的示例代码或文档 我希望这里有人可以解释如何对图像执行布局分析以及如何解析结果数据 Tesseract 可以被赋予一个页面模式参数 psm 可以具有以下值 0 仅
  • Azure 数据库连接错误。 [复制]

    这个问题在这里已经有答案了 大家好 我是 Azure 新手 并且仍在学习所有内在的东西 我正在尝试连接数据库并遇到异常 任何指点都会非常感激吗 不知道大家有没有遇到过这种情况或者是什么原因呢 连接到数据库 System Data SqlCl
  • 自定义验证独特属性 - 泛型类

    我正在尝试进行自定义验证 IsUnique 检查属性值是否唯一并返回正确的消息 这是我的代码 但这仅适用于指定的类 是否可以执行通过元数据获取正确的类的方法 public class ArticleMetaData Required All
  • IntelliJ 无法显示大文件?

    我的文本文件是 1 58G 我的 IntelliJ 自定义 VM 选项设置为 Xmx4G 为什么显示 The file is too large 1 58G Showing a read only of the first 2 56M id
  • 在 Windows 上对嵌入式软件进行原型设计和仿真

    我正在寻找用于原型设计 虚拟原型设计 模拟和测试桌面 Windows 上深度嵌入式 C 代码的工具和技术 包括构建由按钮 LED 和 LCD 显示器 分段和图形 组成的真实嵌入式前面板 我对可能的低级方法特别感兴趣 使用纯 C 代码和原始
  • 如何使用函数作为地图的键

    如何使用函数作为地图的键 例如 type Action func int func test a int func test2 a int func main x map Action bool x test true x test2 fa
  • 如何限制 PostgreSQL 服务器可用的内存?

    对于学术实验我需要限制 pgSQL 服务器可用的内存总量计算给定的一组查询 我知道我可以通过以下方式做到这一点postgresql conf文件 我可以在其中调整一些与资源管理相关的参数 问题是 我不清楚 考虑到配置文件上可用的几个参数 哪
  • Bootstrap 4 文件输入

    我正在努力使用 Bootstrap 4 文件浏览器 如果我使用自定义文件控件 我将始终看到 选择文件值 https v4 alpha getbootstrap com components forms file browser 我想在选择文
  • 显示操作栏菜单按钮

    有没有可能的方法在带有硬件菜单按钮的设备上的操作栏中显示三点菜单 比如三星Galaxy等 看起来您的答案在下面的链接中 有一个解释为什么你不想这样做 另一个答案提供了无论如何都可以做到这一点的技巧 在 android 4 x 设备上 如何在
  • 来自 MSVC 外部“C”的故事

    这个问题我可以找到一个如此重复的答案 但这个答案完全错误 请参阅下面的 C 代码 我明白extern C 不会在 C 中间生成 C 代码 它只是一个链接指令 我有几个这样的extern C 有故事可讲 但今天有一个让我困扰的故事 这是一个完
  • 收到错误 System.ArgumentNullException 未处理,值不能为 null。参数名称:activationContext

    当我尝试运行 Winforms 应用程序但无法找到解决方案时 出现以下异常 System ArgumentNullException was unhandled Message Value cannot be null Parameter
  • 无法在 Swift 中关闭导航控制器

    所以我有一个简单的导航控制器 需要注册 点击 完成 您就会进入主页 问题是当您进入主页时 导航控制器会跟随 正如您在最后一张图片 主页 中看到的 导航栏仍然存在 当用户在我使用的第一张图像上按 完成 时self performSegueWi
  • 如何在 Asp.net Web API 中使用特定的 CultureInfo

    我最近将 WEB API 添加到现有的 VS 桌面应用程序中 一切正常 直到昨天我不得不添加一个带有三个参数的 GET 方法 其中一个是日期 好吧 一开始我以为这只是小菜一碟 但令我惊讶的是 我注意到当我在安装应用程序的服务器上发送 201
  • 负载平衡服务器上的 ASP.NET 表单身份验证

    在负载平衡服务器上使用默认表单身份验证 见下文 是否存在任何可能的问题 如果可以的话 我能做些什么来防止这些问题发生
  • 使用 .NET Core API 在 Angular 7 中登录 Google

    我正在尝试在我的 Angular 应用程序中实现 Google 登录 如果我尝试调用外部登录服务器的 api 端点 则会返回 405 错误代码 如下所示 访问 XMLHttpRequest https accounts google com
  • 如何在 Laravel 5.1 中编写这个(左连接、子查询)?

    如何在 Laravel 5 1 中编写此查询 SELECT p id p title p created at p updated at u name COALESCE c comments count 0 AS comments coun
  • 如何根据模板参数有条件地声明局部变量?

    我想根据模板 bool 参数有条件地在函数中声明局部变量 因此 如果这是真的 它应该在那里 否则不应该在那里 因为我不希望该变量在堆栈上分配内存或调用其构造函数 它也可以是基本类型 我无法在 constexpr if 块中声明它 因为我需要