如果编译时常量参数错误,则生成编译时错误

2024-02-05

我正在尝试编写一个函数,如果使用编译时常量参数调用,如果参数的值与static_assert,但仍然可以在运行时使用计算值进行调用。

有点像这样:

template<int N> void f(N){
  static_assert(N == 5, "N can only be 5.");
  do_something_with(N);
}

void f(int N){
  if(N == 5){
    do_something_with(N);
  }
}

volatile int five = 5;
volatile int six = 6;

int main() {  
  f(5); //ok
  f(6); //compile-time error
  f(five); //ok
  f(six); //run-time abort

  return 0;
}

我怎样才能做到这一点?

另外,如果可能的话,我希望能够保持简单f(something)语法,因为此代码适用于不熟悉模板语法的初学者程序员应该可以使用的库。


我能想象的最好的是constexpr抛出异常的函数。

如果在编译时执行,throw导致编译错误;如果在运行时执行,则抛出异常

就像是

#include <stdexcept>

constexpr int checkGreaterThanZero (int val)
 { return val > 0 ? val : throw std::domain_error("!"); }

int main()
 {
   // constexpr int ic { checkGreaterThanZero(-1) }; // compile error

   int ir { checkGreaterThanZero(-1) }; // runtime error
 }

- 编辑 -

正如 yuri kilocheck 所指出的,您可以调用而不是抛出异常std::abort();举例来说

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

如果编译时常量参数错误,则生成编译时错误 的相关文章

  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • Qt 在 msbuild 下并行 Moc 多个文件

    使用 Qt Visual studio 插件 它似乎可以以一种无缝的方式处理几乎所有事情 不幸的是 它使用 msbuild 中的 CustomBuild 步骤进行 moc ing 这会导致一系列的模仿 一个接一个 有没有办法说服 msbui
  • 您可以在 vi/vim 中替换或删除逗号(或任意字符)之间的内容吗?

    例如 我有这样的文字 I talked to a friend I hiked a mountain I am working with blah blah 我想删除或替换I hiked a mountain 为什么不ci or di 工作
  • 为什么使用非类型模板参数? [复制]

    这个问题在这里已经有答案了 我读过很多问题和答案 但是这个问题 https stackoverflow com questions 12550398 why we use non type template arguments最吸引我的眼球
  • 禁用 Xcode Storyboard 中的约束

    我正在尝试布局一个非常简单的视图 我在视图中以类似网格的间距放置了 4 个自定义按钮 但是当我运行该应用程序时 我得到两个不同大小的按钮 我在这里包含了故事板和模拟器图像 我很想禁用约束 但找不到在哪里执行此操作 我真的不想要他们 这只是一
  • Oracle:如何在 Oracle SQL 中将十六进制转换为十进制?

    如何使用 Oracle SQL 将十六进制转换为十进制 然后再转换回来 如果您使用 8 1 5 及更高版本 您可以使用 要将十六进制转换为十进制 select to number AA xx from dual 要将十进制转换为十六进制 s
  • C++:如何将 ASCII 或 ANSI 转换为 UTF8 并存储在 std::string 中

    我的公司使用这样的代码 std string CT2CA some CString c str 我相信它将 Unicode 字符串 其类型为 CString 转换为 ANSI 编码 并且该字符串用于电子邮件的主题 但是 电子邮件的标头 包括
  • 如何迭代计算运行加权平均值以使最后的值权重最大?

    我想实现一个迭代算法 计算加权平均值 具体的权重法则并不重要 但最新值应接近 1 最旧值应接近 0 该算法应该是迭代的 即它不应该记住所有以前的值 它应该只知道一个最新值以及有关过去的任何汇总信息 例如平均值 总和 计数等的先前值 是否可以
  • Delphi、oAuth 和链接 API、访问令牌未经授权

    我正在开发一个将更新发布到 LinkedIn 的程序 我正在使用 Delphi XE2 oAuth 和 LinkedIn API 来实现相同的目的 我能够请求令牌并授权应用程序 但我在尝试访问令牌时遇到错误 我正在使用 Delphi 的 o
  • Azure AD B2C:完成密码重置流程后无法立即登录

    我们创建了内置的密码重置用户流程 我们使用 Microsoft Graph API 在 B2C 中自动注册用户 并发送一封电子邮件 其中包含密码重置流程的直接链接 以便他们在首次登录时重置密码 用户正确地完成密码重置用户流程 并且它被重定向
  • Robot Framework:- 无法从现有的 Chrome 配置文件中打开 Chrome

    我正在尝试学习机器人框架 我已经在 Selenium Webdriver 上工作过 我试图使用 Create Webdriver 关键字从退出配置文件打开 Chrome 浏览器 但是我做不到 看来 Robot Framework 每次都会打
  • 如何动态保存更改(通过jquery)html DOM?

    我使用 jquery 动态表单得到了一些不错的布局生成器 并且 jquery ui 功能可以更改使用的元素数量 它们的 css 属性等 一切看起来都很棒 但当前结果的呈现存在一个问题 我想保存生成的 html DOM 并以某种方式解析它 从
  • Appium 错误:无法获取 Xcode 版本

    尝试在 Eclipse 上启动测试时出现 Appium 错误 我已经安装了 Xcode 6 4 它应该可以工作 但事实并非如此 error Could not determine Xcode version Could not get Xc
  • 如何使用条件类型分配使类型取决于属性值

    我有一个像这样的 XML 文件
  • 正则表达式匹配一位、两位或三位数

    我试图找到在我的代码中使用 x y 的位置的所有实例 其中 x 和 y 是整数 I tried 0 9 0 9 这可以检测 0 2 3 5 等 但它不能检测 0 50 或 255 255 如何使支票包含所有号码 这不是一种编程语言 这是 N
  • 错误代码:23 打开文件时资源不足

    当我在 MySQL 中执行查询时 出现以下错误 错误代码 23打开文件 test sample table P p364 MYD 时资源不足 错误代码 24 打开的文件太多 MySQL 版本详细信息 VERSION 5 6 21 versi
  • IE 对 HTMLDocument 和 HTMLElement 有何看法

    在javascript的范围内 参考HTMLDocument https developer mozilla org en DOM HTMLDocument or HTMLElement https developer mozilla or
  • 如何删除neo4j图中的所有关系?

    我需要删除所有节点之间的所有关系 有没有办法删除neo4j图中的所有关系 请注意 我使用的是 ruby 绑定 neography宝石 gem 的 wiki 中没有相关信息 我也尝试在 neo4j 文档中找到一种方法来完成此操作 但没有任何结
  • c++ eclipse错误错误解释

    我在使用 eclipse C 时遇到问题 我的项目编译并运行 但 eclipse juno 一直说有数千个错误 例如 我的代码中有一个函数SetRun eclipse提到这个错误 调用无效参数 候选者是 void SetRun 而SetRu
  • 下载联系人应用程序的 Android 代码

    我正在尝试从 git 存储库下载联系人 拨号器和通话记录应用程序的 Android 源代码 我在我的 mac 上尝试了以下操作 运行 SnowLeopard 1 创建一个bin目录和一个android目录来放置所有下载的文件2 将这两个目录
  • 如果编译时常量参数错误,则生成编译时错误

    我正在尝试编写一个函数 如果使用编译时常量参数调用 如果参数的值与static assert 但仍然可以在运行时使用计算值进行调用 有点像这样 template