【问题标题】:Initialize object in a class-specific way以特定于类的方式初始化对象
【发布时间】:2021-07-07 09:27:04
【问题描述】:

我有一个名为NumBase 的类,我想通过特殊的自定义来初始化该类的对象,如下所示:

NumBase<8> Num1 = 2312347;
NumBase<10> Num2 = 23123479;
NumBase<16> Num3 = 23F13A47;
NumBase<12> Num4 = 2312A47;

有没有办法像这样初始化?

或者

NumBase(8) Num1 = 2312347;
NumBase(10) Num2 = 23123479;
NumBase(16) Num3 = 23F13A47;
NumBase(12) Num4 = 2312A47;

还有

NumBase<8> Num1(2312347);
NumBase<10> Num2(23123479);
NumBase<16> Num3(23F13A47);
NumBase<12> Num4(2312A47);

但不是这样:

NumBase<16> Num3("23F13A47");

NumBase<16> Num3 = "23F13A47" ;

换句话说,我不想使用字符串。

如果可以,我该怎么做?

【问题讨论】:

  • 如果您可以为十六进制文字引入正确的语法:0x23F13A47,那么就不会有问题。
  • 02312347 (oct)、23123479 (dec) 和 0x23F13A47 (hex) 有什么问题?
  • 我认为这不可能。 23F13A47 不是单个标记,编译器将其视为 23 和自定义文字 F13A47
  • 整数字面量有十进制、十六进制和八进制:en.cppreference.com/w/cpp/language/integer_literal
  • 请告诉我们为什么您不想使用字符串并指定限制:您需要支持哪些基础? 2..36?也许也是一元的?

标签: c++


【解决方案1】:

这是不可能通过 user-defined literals 自 C++11 以来提供的,因为这些文字是通过将传统文字与用户定义的前缀组合而成的。原因是 C++ 词法分析过程不能通过用户定义的类型来改变。

使用标准方法最接近您的目标的方法是字符串文字与用户定义的后缀的组合,所以像这样

unsigned operator "" _nb(const char* str);

或者那个

unsigned operator "" _nb(const char* str, std::size_t len);

len 为您提供字符串文字的长度。这会将翻译保留给您。您可以提供专门的字符串到 ? 位解码的版本以进行优化。

详情请参阅User Defined Literals for a String versus for a Hex Value

【讨论】:

    猜你喜欢
    • 2020-05-12
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多