如何在编译时检查表达式是否非法?

2024-02-10

我的应用程序遇到问题,我想断言函数应用程序将被编译器拒绝。有没有办法通过 SFINAE 检查这一点?

例如,假设我想验证std::transform to a const范围非法。这是我到目前为止所拥有的:

#include <algorithm>
#include <functional>
#include <iostream>

namespace ns
{

using std::transform;

template<typename Iterator1, typename Iterator2, typename UnaryFunction>
  struct valid_transform
{
  static Iterator1 first1, last1;
  static Iterator2 first2;
  static UnaryFunction f;

  typedef Iterator2                   yes_type;
  typedef struct {yes_type array[2];} no_type;

  static no_type transform(...);

  static bool const value = sizeof(transform(first1, last1, first2, f)) == sizeof(yes_type);
};

}

int main()
{
  typedef int *iter1;
  typedef const int *iter2;
  typedef std::negate<int> func;

  std::cout << "valid transform compiles: " << ns::valid_transform<iter1,iter1,func>::value << std::endl;

  std::cout << "invalid transform compiles: " << ns::valid_transform<iter1,iter2,func>::value << std::endl;

  return 0;
}

不幸的是,我的特质既拒绝合法案件,也拒绝非法案件。结果:

$ g++ valid_transform.cpp 
$ ./a.out 
valid transform compiles: 0
invalid transform compiles: 0

你的问题类似于SFINAE + sizeof = 检测表达式是否编译 https://stackoverflow.com/questions/2127693/sfinae-sizeof-detect-if-expression-compiles.

Summary该答案:sizeof计算传递给它的表达式的类型,包括实例化函数模板,但它不生成函数调用。这就是 Lol4t0 的观察背后的原因sizeof(std::transform(iter1(), iter1(), iter2(), func()))即使std::transform(iter1(), iter1(), iter2(), func())才不是。

您的具体问题可以通过评估 Lol4t0 答案中的模板来解决,以获取要提供给的任何输出范围std::transform。然而,在模板中验证函数调用是否会编译的一般问题似乎无法通过sizeof + SFINAE诡计。 (它需要一个可从运行时函数调用派生的编译时表达式)。

你可能想尝试概念海湾合作委员会 http://www.generic-programming.org/software/ConceptGCC/看看这是否允许您以更方便的方式表达必要的编译时检查。

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

如何在编译时检查表达式是否非法? 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

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

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

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

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

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 是否可以在网格行定义上使用触发器?

    我有一个网格 其行需要根据视图模型动态调整大小 我想做类似以下的事情
  • 在生产模式下构建会导致空页面,而在开发模式下构建则完美运行(Angular 8)

    在开发模式 APS WebAPI 下 构建工作完美 没有错误 ng b watch 当更改为生产模式 ng b aot 或 ng b prod 时 页面加载时不会出现错误 但会导致空页面 Index cshtml 将通过从 Homecont
  • Node.js 编程工作流程 - 测试、代码、测试

    在开始用 Node js 开发有用的东西之前 您的流程是什么 您是否在 VowJS Expresso 上创建测试 你使用 Selenium 测试吗 什么时候 我有兴趣获得一个很好的工作流程来开发所有类似于 Rails 的 Node js 应
  • 如何在具有多个电源的单个模块项目中设置 sbt-native-packager

    我有一个单模块客户端 服务器项目 每个项目都有一个主模块 我正在尝试使用sbt native packager为两者生成启动脚本 项目 P scala object Tactic extends Build lazy val root pr
  • Pointfield 与 geodjango、javascript 和 google 地图

    我正在尝试显示并绘制数据库中存储的纬度和经度点的线 这是我的代码 为了简洁起见 我删除了一些不必要的变量 这是我的模型 class GpsLog models Model device models ForeignKey Device re
  • R 中的滚动计算

    我正在尝试使用数据表在 R 中建立摊销贷款帐户模型 每行代表一个月 每个月都会有一笔还款或预支资金 并根据上个月的余额收取利息 例如 gt loan lt data table loan age seq 0 9 payment c 5000
  • 输出包含所有转义字符的 C++ 字符串

    我有一个像这样的字符串 string s t Hello n 当我打印它时 它会给我一个选项卡 然后是 Hello 然后是一个新行 但是 我是否可以打印它 以便在控制台中看到 t Hello n 换句话说 我希望字符串忽略转义字符并将其视为
  • 使用 Scala 模式匹配时工作正则表达式失败

    在以下代码中 使用 Java API 时会匹配相同的模式 但使用 Scala 模式匹配时不会匹配 import java util regex Pattern object Main extends App val text oAuth h
  • 如何使用批处理文件重命名文件以包含日期?

    我有一个显示警报打印机的文本文件 我想在Windows XP下设置一个批处理文件 以更改警报打印机的默认名称以包含日期 这将使搜索错误变得更加容易 警报打印机被捕获到文本文件中 我已经能够更改名称 但每次我尝试将名称设置为日期时 要么什么也
  • TestNG:在运行时更改线程数

    假设我有一个可以并行或串行执行的套件 然而 这样做的决定要等到运行时才能决定 启动该套件的常见方法如下 TestNG runner new TestNG if runInParallel set parallel mode too here
  • Flash 横幅在 Chrome 中不起作用

    我的网站中有一些 Flash 横幅和一些 GIF 几天前 我注意到使用 Chrome 浏览时 Flash 不工作 用IE浏览时一切正常 这是我的网站的链接 http batgalim org il http batgalim org il
  • 为什么 Numpy 只有维度 (n,) 而不是 (n,1) [重复]

    这个问题在这里已经有答案了 我对此感到好奇有一段时间了 我可以忍受这一点 但如果不采取足够的照顾 它总是会咬我 所以我决定将其发布在这里 假设以下示例 Numpy 版本 1 8 2 a array 0 1 2 3 print shape a
  • 在输入文本字段之前禁用按钮?

    我在一个视图中有几个 uitextfields 我想禁用 uibutton 直到所有字段都输入了一些内容 这样做的最佳方法是什么 理想情况下 我也想做一些基本验证 确保所有条目都是数字 EDIT 无法让以下解决方案完全发挥作用 下面是我工作
  • 如何在 Symfony2 表单中为集合添加自动完成字段并使用 Propel?

    我将 Symfony 2 1 表单与 PropelBundle 一起使用 并且尝试重构一个具有对象下拉列表 可供选择 的表单 以代替使用 jquery 自动完成字段 使用 AJAX 对于下拉列表 我在表单类型中使用了以下代码 对于下拉列表来
  • iOS 8.3 Mobile Safari 禁用表情符号渲染

    苹果最近发布了iOS 8 3 他们添加了更多表情符号 现在所有表情符号都在移动 safari 中呈现 例如 将呈现为表情符号图标 有没有办法禁用表情符号渲染 例如通过 CSS 或 JavaScript 是的 您可以使用适当的变体字形逐个字符
  • 如何使用邮递员休息客户端将post请求发送到以下post方法

    我只是想知道如何将 JSON 对象发送到createTrackInJSON Track track 方法 用 Post通过邮递员休息客户端进行注释 这里 如何将 JSON 对象传递给 createTrackInJSON Track trac
  • UWP/Windows 10 移动版中的 System.Threading.Thread 替换

    在UWP中 如何访问线程对象 我想更改我将管理的主线程和附加线程的名称 我还想检查当前线程是否是主线程 我的目标是 Windows 10 Mobile 以下代码示例适用于桌面 但不适用于手机 获取 System DllNotFoundExc
  • state_activated预蜂窝

    你如何使用
  • 每个请求的 DbContext

    我需要为导入文件实现多线程后台作业 我已经通过后台作业 Hangfire 实现了它 但如果我使用一个线程 它会变得非常慢 该函数看起来像这样 我使用非事务单元立即保存对数据库的更改 var contactFound await contac
  • 如何在编译时检查表达式是否非法?

    我的应用程序遇到问题 我想断言函数应用程序将被编译器拒绝 有没有办法通过 SFINAE 检查这一点 例如 假设我想验证std transform to a const范围非法 这是我到目前为止所拥有的 include