为用户定义的枚举重写 std::to_string 是为用户定义的枚举提供 to_string 的正确方法吗?

2023-12-19

C++ 没有办法获取枚举的字符串表示形式。人们通过编写包含大量样板代码的自定义函数来解决这个问题
switch with case XYZ return "XYZ";

当然,这需要枚举的用户知道自定义函数的名称。

所以我想我可以添加一个专业std::to_string使用户能够使用to_string在我的枚举上。像这样的事情:

//
#include <iostream>
#include <string>
#include <cassert>
#define TEST
class Car
{
public:
    enum class Color
    {
        Red,
        Blue,
        White
    };
};
#ifdef TEST
#include <string>
namespace std
{
    std::string to_string (Car::Color c)
    {
        switch (c)
        {
        case Car::Color::Red:
            return "Red";
        case Car::Color::Blue:
            return "Blue";
        case Car::Color::White:
            return "White";
        default:
            {
                assert(0);
                return "";
            }
        }
    }

}
#endif
int main()
{
    std::cout << std::to_string(Car::Color::White) << std::endl;

}

这个解决方案有什么问题吗?


这不是“压倒一切”(适用于virtual函数),并且您还没有添加“专业化”(适用于模板),您添加了一个重载,它将新函数的声明和定义添加到命名空间std这是被禁止的:

17.6.4.2.1 命名空间 std [namespace.std]
如果 C++ 程序向命名空间添加声明或定义,则其行为是未定义的std或命名空间内的命名空间std除非另有规定。仅当声明依赖于用户定义类型并且专门化满足原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板专门化添加到命名空间 std。

更好的解决方案是在您自己的名称空间中重载它,然后调用to_string(c)代替std::to_string(c)。这将找到正确的功能,并且您不需要添加任何内容std

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

为用户定义的枚举重写 std::to_string 是为用户定义的枚举提供 to_string 的正确方法吗? 的相关文章

随机推荐

  • 如何在.NET中创建和使用资源

    如何创建一个可以在程序的各个部分轻松引用和使用的资源 我的具体问题是我有一个 NotifyIcon 我想根据程序的状态更改其图标 这是一个常见问题 但我已经困扰了很长时间 好吧 在四处搜索并拼凑了 StackOverflow 周围的各个点之
  • Linq.Except 的更多“SQL 语法”

    Linq 中的大多数表达式都可以用两种语法编写 基本上 方法语法和类似 SQL 的语法 例如 方法语法 var results MySet Where n gt n Status State ACTIVE 类似 SQL 的语法 var re
  • 如何将选中的复选框(Aero 主题)渲染到 RenderTargetBitmap?

    我的复选框呈现时没有复选标记 如果我只使用一个复选框 实例对象 进行渲染 那么我可以显示复选标记 但我无法使用此解决方案 我需要能够使用本地复选框渲染它 此复选框通过 PresentationFramework Aero component
  • MySQL触发器中的多个if语句

    如果 MySQL 触发器中有多个 if 语句 最好的方法是什么 目前我的 SQL 如下所示 IF NOT NEW status lt gt OLD status THEN my sql ELSEIF NOT NEW actual lt gt
  • Internet Explorer 11:空白页内存泄漏?

    互联网浏览器 11 版本 11 0 9600 17280 更新版本 11 0 12 KB2977629 HTML 页面 测试方法 导航至页面 打开开发者工具 F12 切换到内存选项卡 开始分析会话 按住页面上的刷新按钮 F5 观察内存的爬升
  • 以编程方式调用 Pylint

    我想调用 Pylint 检查器 仅限于错误信号部分 作为我的单元测试的一部分 所以我检查了 Pylint 可执行脚本 找到了pylint lint Run助手类 在那里我迷失了很长一段时间 init 函数 以调用结束sys exit 有人尝
  • 将表结构复制到sqlite3中的新表

    有没有一种简单的方法将现有表结构复制到新表结构 不需要数据 只需要结构 gt 如 id INTEGER name varchar 20 Thx 你可以使用这样的命令 CREATE TABLE copied AS SELECT FROM my
  • Gio.MemoryInputStream 关​​闭时不会释放内存

    在 Windows 7 上运行 Python 3 4 Gio MemoryInputStream 的 close 函数不会释放内存 而它应该释放内存 测试代码是 from gi repository import Gio import os
  • 使用 ServiceStack.Text 作为 SignalR 的 JSON 序列化器

    为了在我的应用程序层中实现一致的序列化 我想对 SignalR 使用与我在其他地方使用的相同的序列化库 ServiceStack Text 在关注 SignalR 的 Wiki 时entry https github com SignalR
  • Redis:如何将“正常”集与排序集相交?

    假设我有一个集合 或者排序的集合或列表 如果这样会更好 A100 到 1000 个字符串 然后我有一个排序集B还有更多的字符串 比如说一百万 Now C应该是交集A and B 当然是弦乐 我想要拥有 X 所在的每个元组 X SCORE O
  • Java 8:比较不同类型列表的更有效方法?

    在单元测试中 我想验证两个列表是否包含相同的元素 要测试的列表是由以下列表构建的Person对象 其中一个类型字段String被提取 另一个列表包含String文字 人们经常会发现以下代码片段来完成此任务 请参阅这个答案 https sta
  • 有一些基本 R 解析器的代码吗?

    我正在寻找用于解析 R 代码的 Bison Flex 实现 以便我可以在 C 程序中使用它来实现使用 R 表达式的编程语言 我在谷歌上找不到任何可用的东西 除了这个 https github com halpo parser https g
  • Task.Delay 超过 int.MaxValue 毫秒

    最大持续时间aTask Delay可以告诉延迟的是int MaxValue毫秒 创建一个最干净的方法是什么Task哪个会延迟到那个时间之后 Fine await Task Delay TimeSpan FromMilliseconds in
  • Ruby:转义 unicode 字符串

    统一码字符串 string CEO Frye u2013 response to Capitalism discussion in Davos Vote aggressively with your wallet against firms
  • Maven:指向多个 jar 的系统依赖项

    是否可以在 pom 中定义一个依赖项 使其具有系统范围但指向多个 jar 我确信这很不正统 但是 我只是想知道这是否可能 所以像这样
  • Java封装概念不清楚

    这是基本问题 但我仍然不理解封装概念 我不明白我们如何更改其他类的类属性 因为每当 我们尝试设置类的公共实例值 我们必须创建该类的对象 然后设置值 每个对象引用不同的内存 所以即使我们改变 这不会影响任何其他对象的实例值 即使我尝试使用静态
  • 有没有办法通过添加带有情感的元素来增加特异性?

    我们有一个样式化的组件 当它编译时 它会添加一个类名 如下所示 div class app a class css hash link a div 这一切都很好 除了有人声明了类似于以下内容的 CSS 的情况 app a color red
  • bash getopts 具有多个强制选项

    是否可以使用 getopts 一起处理多个选项 例如 myscript iR 或 myscript irv 另外 我遇 到的情况是 基于条件脚本需要强制选项 例如 如果脚本的参数是一个目录 我将需要指定 R 或 r 选项以及任何其他选项 m
  • 如何在 Android 版 Genymotion 模拟器中拨打来电?

    我如何拨打电话根尼运动 https www genymotion com 安卓模拟器 我正在使用 Genymotion 模拟器来运行和测试我的应用程序 在本机模拟器DDMS中 我们可以进行假调用 这可以使用 Genymotion 模拟器来完
  • 为用户定义的枚举重写 std::to_string 是为用户定义的枚举提供 to_string 的正确方法吗?

    C 没有办法获取枚举的字符串表示形式 人们通过编写包含大量样板代码的自定义函数来解决这个问题 switch with case XYZ return XYZ 当然 这需要枚举的用户知道自定义函数的名称 所以我想我可以添加一个专业std to