更好的说法是 x == Foo::A || x == Foo::B || x == Foo::C || ...?

2024-01-08

假设我有一堆众所周知的价值观,就像这样(但是const char *这只是一个例子,可能更复杂):

const char *A = "A", *B = "B", *C = "C", *D = "D", *E = "E", *F = "F", *G = "G";

现在假设如果某个表达式的结果位于这些表达式的子集中,我想以特定的方式表现:

if (some_complicated_expression_with_ugly_return_type == A ||
    some_complicated_expression_with_ugly_return_type == C ||
    some_complicated_expression_with_ugly_return_type == E ||
    some_complicated_expression_with_ugly_return_type == G)
{
    ...
}

我发现自己经常输入此类内容,因此我想要一个简写形式。

如果语言是 Python,我可以轻松地说:

if some_complicated_expression_with_ugly_return_type in [A, C, E, G]:
    ...

有没有一种众所周知的、可移植的方式让我在 C++03 中类似地表达这一点?

请注意,返回类型本身很丑陋(几乎与返回类型一样丑陋)lambda 表达式 http://www.boost.org/doc/libs/1_51_0/doc/html/typeof.html#typeof.moti),所以我当然不想将它存储在局部变量中。

但返回类型确实如此not必须与常量匹配——例如,如果返回类型是std::string, 它会not可以隐式转换为const char *, but operator ==非常适合比较。

到目前为止,我最好的解决方案是这样说:

const char *items[] = { A, C, E, G };
if (std::find(items, items + sizeof(items) / sizeof(*items),
              some_complicated_expression_with_ugly_return_type)
    != items + sizeof(items) / sizeof(*items))
{
    ...
}

但它实在是太丑了。有没有更好的方法,也适用于非 POD?


如果您有 C++11:

auto res = some_complicated_expression_with_ugly_return_type;
if (res == A
    || res == C
    || res == E
    || res == G) {
}

如果没有,您仍然可以使用模板函数来消除类型声明:

template <class T>
bool matches(T t) {
    return t == A || t == C || t == E || t == G;
}

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

更好的说法是 x == Foo::A || x == Foo::B || x == Foo::C || ...? 的相关文章

  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 使用 C# 读取 Soap 消息

  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • Vue:在 div 单击时,转到数据中定义的 url

    我在数组中有这种对象 name name1 url http url 1 tld name name2 url http url 2 tld 单击 div 时 我想要将 window location href 指向url 但我似乎无法从数
  • 如何以编程方式将代理添加到 NSURLSession

    查看文档NSURLSession and NSURLSessionConfiguration 我的印象是我应该使用如下所示的字典来配置它 Create a dictionary to describe the proxy NSDiction
  • 后台线程 Core Data 对象属性更改不会反映在 UI 上

    假设我想添加一个新项目PlaylistCoreData 的实体并将其放入后台线程并将其推回到主线程 然后将其反映在 tableView 上 好吧 该代码在没有后台线程实现的情况下工作正常 但是当我应用下面的背景代码时 之后createPla
  • 两个不同平台上的类文件大小是否存在差异?

    假设我有一个包含大量代码的 java 文件 如果我在不同的平台上构建这个文件 就像windows和solaris一样 两个类文件是否有可能具有可识别的不同大小 如果是 原因是什么 如果您使用不同版本的编译器或不同的设置 特别是关于包含哪些调
  • 撰写:将文本包装在行布局中,而不是将同级文本推出

    我正在尝试 Jetpack Compose 但 Row 的行为让我感到困惑 我在图标按钮旁边有一个文本 我希望图标按钮锚定到最小宽度为 48dp 的一侧 并让文本环绕它 像这样 但文本不会换行 它会占用行中的所有空间 Composable
  • 编写没有语法文件的自定义 Xtext/ANTLR 词法分析器

    我正在为 CoffeeScript 编写一个 Eclipse Xtext 插件 我意识到我可能需要手动为其编写一个词法分析器 CoffeeScript 解析器还使用手写词法分析器 https github com jashkenas cof
  • mod_php 和 cgi php 脚本有什么区别?

    mod php 和 cgi php 脚本有什么区别 我的意思是 为什么最好 是吗 使用 mod php 而不是简单的 php 脚本 并将它们作为 CGI 运行 Thanks 使用 CGI 时 PHP 进程由 Apache 启动 并且是该 P
  • SLComposeViewController 完成处理程序

    您好 如果使用 SLComposeViewController CompletionHandler 完成推文 我如何收到通知 这是发送推文的代码 if SLComposeViewController isAvailableForServic
  • 在没有 IIS 和 VS 2017 的情况下使用 Kestrel

    依赖于微软文档 Kestrel 可以单独使用 也可以与反向代理服务器 例如 IIS Nginx 或 Apache 一起使用 反向代理服务器接收来自 Internet 的 HTTP 请求 并在进行一些初步处理后将它们转发到 Kestrel 如
  • 使用导数和雅可比增强 odeint 类

    我打算在 MCMC 例程中使用 Boost odeint 库来估计 ODE 模型中的参数 由于这些 ODE 可能很僵硬 因此我需要能够将雅可比矩阵与导数一起传递到求解器中 我想创建一个类 其中参数和初始值作为私有成员 然后将导数 雅可比和更
  • 我应该在私有/内部方法中添加空参数吗?

    我正在编写一个库 它具有多个公共类和方法 以及库本身使用的多个私有或内部类和方法 在公共方法中 我有一个空检查和一个抛出 如下所示 public int DoSomething int number if number null throw
  • Java:使用异步编程优化应用程序

    我必须修改 dropwizard 应用程序以提高其运行时间 基本上 该应用程序每天接收大约 300 万个 URL 并下载和解析它们以检测恶意内容 问题是该应用程序只能处理 100 万个 URL 当我查看该应用程序时 我发现它正在进行大量顺序
  • 将文件下载到特定文件夹 python

    我可以从以下位置下载文件URL以下方式 import urllib2 response urllib2 urlopen http www someurl com file pdf html response read 我能想到的一种方法是以
  • 从流中读取数据的最有效方法

    我有一种使用对称加密来加密和解密数据的算法 无论如何 当我要解密时 我有 CryptoStream cs new CryptoStream ms cryptoTransform CryptoStreamMode Read 我必须从 cs C
  • 来自产品 ID 的 MSI 产品代码?

    我正在尝试将 MSI 产品代码 GUID 转换为用于标识 MSI 注册表项中已安装项目的产品代码 ID 有这方面的API吗 如果不是 这该怎么办 Warning Microsoft 强烈建议您不要弄乱他们的 MSI 注册表项 但如果您确实必
  • 如何删除 AWS ECS 任务定义?

    在 Amazon 的 EC2 容器服务中创建任务定义后 如何删除或移除它 It s a 已知问题 https forums aws amazon com thread jspa threadID 170378 一旦取消注册任务定义 它就会进
  • PHP:没有连接的字符串中的变量

    如果我在这个字符串中有一个变量 var echo Hello there are many vars Php 寻找variable vars代替 var 没有连接 如 Hello there are many var s 还有另一种方法可以
  • Jboss不部署战争,JBAS011006

    我需要你的帮助 我正在尝试将 WAR 部署到 Jboss Application Server 7 1 但无法实现 我通过 Web 控制台部署它 它在部署过程中冻结 没有任何错误 这是我的 server log http rghost ru
  • HTML5

    我想知道这是什么意思
  • 更好的说法是 x == Foo::A || x == Foo::B || x == Foo::C || ...?

    假设我有一堆众所周知的价值观 就像这样 但是const char 这只是一个例子 可能更复杂 const char A A B B C C D D E E F F G G 现在假设如果某个表达式的结果位于这些表达式的子集中 我想以特定的方式