C++ 检查 if 语句可以被 constexpr 计算

2023-12-24

有没有一种方法可以决定是否可以对某些内容进行 constexpr 求值,并将结果用作 constexpr 布尔值?我的简化用例如下:

template <typename base>
class derived
{
    template<size_t size>
    void do_stuff() { (...) }

    void do_stuff(size_t size) { (...) }
public:
    void execute()
    {
        if constexpr(is_constexpr(base::get_data())
        {
            do_stuff<base::get_data()>();
        }
        else
        {
            do_stuff(base::get_data());
        }
    }
}

我的目标是C++2a。

我发现了以下 reddit 线程,但我不太喜欢宏。https://www.reddit.com/r/cpp/comments/7c208c/is_constexpr_a_macro_that_check_if_an_expression/ https://www.reddit.com/r/cpp/comments/7c208c/is_constexpr_a_macro_that_check_if_an_expression/


这是另一个更通用的解决方案(适用于任何表达式,无需每次定义单独的模板)。

该解决方案利用了 (1) 从 C++17 开始,lambda 表达式可以是 constexpr (2) 从 C++20 开始,无捕获 lambda 的类型是默认可构造的。

这个想法是,返回的重载true当且仅当Lambda{}()可以出现在模板参数中,这实际上要求 lambda 调用是常量表达式。

template<class Lambda, int=(Lambda{}(), 0)>
constexpr bool is_constexpr(Lambda) { return true; }
constexpr bool is_constexpr(...) { return false; }

template <typename base>
class derived
{
    // ...

    void execute()
    {
        if constexpr(is_constexpr([]{ base::get_data(); }))
            do_stuff<base::get_data()>();
        else
            do_stuff(base::get_data());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 检查 if 语句可以被 constexpr 计算 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 如何以编程方式更改列表视图高度..?

    我想知道如何以编程方式更改列表视图的高度 是否可以更改单个列表项的子项高度 ViewGroup LayoutParams params listView getLayoutParams params height whatYouWant l
  • 通过Python中的服务帐户访问Google Cloud Storage的权限

    我正在尝试获取一个服务帐户来在 Google Cloud Storage 中创建 blob 来自 Python 脚本 但我遇到了凭据问题 1 我为我的项目创建服务帐户 然后下载 json 格式的密钥文件 home user config g
  • 为什么数组需要 ClassTags 而 List 这样的集合不需要?

    这工作正常 def x A a A List a 没有适用于 A 的 ClassTag def y A a A Array a 但这当然是犹太洁食 def y A ClassTag a A Array a 是什么赋予了 数组在运行时保留其类
  • 按文件夹对伊斯坦布尔代码覆盖率报告进行分组

    我正在使用 istanbul 和 nyc 命令运行 NodeJs 的代码覆盖率报告 我使用 mocha 进行单元测试 我按照预期得到了每个文件的报告 但我希望看到的是具有单个目录摘要的报告 让我更详细地解释一下我得到了什么以及我想看到什么
  • ValueError:在 LightGBM 中检测到循环引用

    训练LightGBM模型时出现以下错误 Train the model import lightgbm as lgb lgb train lgb Dataset x train y train lgb val lgb Dataset x t
  • IE8 的 calc() 是否有仅 CSS 的后备方案

    我知道有一个CSS 后备calc 适用于IE6 7 https stackoverflow com questions 16034397 css calc alternative 同样 我知道有jQuery 的替代品 https stack
  • Android - 按下主页键时关闭应用程序

    我制作的这个应用程序运行良好 但是当我离开该应用程序并再次打开它时 它总是强制关闭 我怎样才能做到当用户按下主页和 或返回键时它会杀死应用程序进程 使得当应用程序再次打开时它有一个全新的开始 您不应该 终止进程 您应该处理主页按钮按下和其他
  • Azure API 管理(策略)

    我需要帮助为我的一项任务制定 APIM 策略 我有两个有效负载 从外部服务获取 UniqueID 并验证 Webhook 来自该外部服务 发送请求时 其他有效负载将进入请求正文 这两个有效负载有些不同 因此当我将来自外部服务的有效负载放入其
  • 表面视图示例

    所以我花了大约两天的时间试图找到一份工作SurfaceView 我在网上遵循的教程即使严格遵循也不起作用 我通常会看到全黑的屏幕 为了帮助自学它是如何工作的 我需要一个工作SurfaceView程序 我正在寻找一个具有以下功能的程序Surf
  • 在 zend 框架下载中找不到 zf.bat [重复]

    这个问题在这里已经有答案了 可能的重复 Zend Framework 2 bin 文件夹中 Zend Tool Missing https stackoverflow com questions 10778626 zend framewor
  • 不使用 matlab 头文件和库编写 MAT 文件

    我有一些数据想要保存到 MAT 文件 版本 4 或 5 或任何版本 问题是 我想在不使用 matlab 库的情况下完成此操作 因为此代码不需要在装有 matlab 的机器上运行 我的程序使用 Java 和 C 因此这些语言中实现此目的的任何
  • openssl:减少内存使用

    再会 我们有一个用 C 编写的服务器 它接受许多 SSL TLS 连接 我们正在使用 boost asio 所以后端是openssl 建立 SSL 目前 服务器每个连接使用大约 160 200kbyte 的内存 我们希望减少这种使用量 bo
  • Android 有没有办法判断用户设备是否有实际键盘?

    我想检测当前用户的手机是否有硬件键盘或只有屏幕键盘 通过 SDK 可以实现吗 是的你可以 获取配置 http developer android com reference android content res Configuration
  • 为什么我的 Bootstrap 表会溢出包含卡?

    实际上我正在尝试在引导卡内设置一个表格 问题是表格宽度超出了该卡的范围 我会阻止它 该表是针对 1 th 和 96 td 的每个 tr 制作的 我试图将表格宽度设置为 100 并设置为每个 td 宽度的 1 但我没有成功 这是表代码 div
  • 重新分配返回 NULL

    int main struct lottery array array struct lottery malloc 3000 sizeof struct lottery int opt counter menu1 scanf d opt i
  • python中LMAX架构中的业务逻辑imp

    I am trying to implement disruptor in Lmax https martinfowler com articles lmax html architecture As you know in lmax ar
  • Node.js 中的同步 TCP 读取

    有没有办法在node js中同步读取TCP套接字 我很清楚如何通过向套接字的 数据 事件添加回调来异步执行此操作 socket on data function data now we have the string data to do
  • 如何记录具有多个别名的方法?

    我正在尝试记录获取名称 以下 Person 构造函数的方法 JavaScript 代码 Creates a person instance param string name The person s full name construct
  • LVL 库 Google Play 许可响应代码始终未获得测试帐户的许可

    我已经使用 LVL 库向我的 Android 应用程序添加了许可 对于在 Google Play 中购买的普通用户来说 许可工作正常 我认为是这样 我没有任何关于问题的反馈 当我主要使用一些测试帐户在第二台设备上测试它时 它也有效 目前 我
  • C++ 检查 if 语句可以被 constexpr 计算

    有没有一种方法可以决定是否可以对某些内容进行 constexpr 求值 并将结果用作 constexpr 布尔值 我的简化用例如下 template