【问题标题】:Checking that macro parameter is one of the allowed ones?检查该宏参数是允许的参数之一吗?
【发布时间】:2019-11-21 08:52:10
【问题描述】:

我想完成以下任务:

#define FOO(bar, ...) \
  static_assert(bar == "foo" || bar == "bazz", "Invalid value for bar") \
  ...

换句话说,我想在编译时检查给宏的值是否是允许的值之一。在与可变长度的字符串进行比较时,进行编译时字符串比较的最简洁方法是什么?

【问题讨论】:

  • 我想说最简洁的方法是“不要使用宏”...使用 C++17,您可以使用很多编译时工具。
  • @MaxLanghof 你有模板草图吗?
  • 另外,既然你问“最干净的方法是什么”:你有脏的吗?
  • 您可能对this post 及其答案感兴趣。我认为这是一个骗局。 (我通过谷歌搜索发现——提示,提示。)
  • 为什么不用enum代替字符串?

标签: c++ c++17


【解决方案1】:

你可以使用字符串视图。

#include <string_view>

using namespace std::string_view_literals;

// Note the sv after the string
#define FOO(bar, ...) \
  static_assert(bar == "foo"sv || bar == "bazz"sv, "Invalid value for bar") \
  ...

表达式"foo"sv 调用文字运算符。它从"foo" 构造一个std::string_view。 std::string_view 重载了 == 运算符,用于与字符串进行比较。这些重载的运算符是constexpr,这意味着它们可以在编译时进行评估。

【讨论】:

  • 不知道“sv”把戏!这正是我正在寻找的东西。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多