首页 > 解决方案 > 如何将用户定义的文字放在 C++ 中相同类型的 constexpr 类中?

问题描述

我想实现自己的字符串文字类Literal和运算符:

constexpr Literal operator""_s(const char* str, size_t size);

class Literal {
  friend constexpr Literal operator"" _s(const char*, size_t);

  constexpr Literal(const char* str, size_t size);

  const char* str = nullptr;
  const size_t size = 0u;
};

然后我想在我的类中放置一个空文字:

class Literal {
  …
  static constexpr const Literal empty = ""_s;
  …
};

正如预期的那样,编译器拒绝这种构造,因为此时类不完整。另外我建议它在技术上应该是可能的,因为编译器只需要将一对char* str = nullptrandsize_t size = 0放在某处,并empty在编译时将其分配给我的类的静态实例。

是否有一些“技巧”来实现这样的子句:auto new_literal = Literal::empty;

标签: c++c++17syntactic-sugaruser-defined-literals

解决方案


是否有一些“技巧”来实现这样的子句:auto new_literal = Literal::empty;

可以添加静态成员函数,

class Literal {
  // …
  static constexpr Literal empty() { return ""_s; }
  // …
}

,并像使用它一样使用它

constexpr auto new_literal = Literal::empty();

但是,请注意

static_assert("" != nullptr);
static_assert(""[0] == '\0');

推荐阅读