检查宏参数是否为允许的参数之一?

3
我希望能够实现以下类似的功能:
#define FOO(bar, ...) \
  static_assert(bar == "foo" || bar == "bazz", "Invalid value for bar") \
  ...

换句话说,我想在编译时检查宏所接收的值是否是允许的值之一。当与长度可变的字符串进行比较时,如何以最简洁的方式进行编译时字符串比较?


1
我认为最干净的方法是“不要使用宏”……在C++17中,您可以使用许多编译时工具。 - Max Langhof
@MaxLanghof 你有模板草图吗? - Peter - Reinstate Monica
1
另外,既然你问“最干净的方式是什么”,那你有一个不干净的方式吗? - Peter - Reinstate Monica
你可能会对这篇帖子和其中的回答感兴趣。我认为这是一个重复的问题。(我通过谷歌搜索找到了它--提示,提示。) - Peter - Reinstate Monica
1
为什么不使用enum而不是字符串? - Jarod42
显示剩余5条评论
1个回答

3
你可以使用字符串视图。
#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_viewstd::string_view有重载==运算符,用于与字符串进行比较。这些重载的运算符是constexpr的,这意味着它们可以在编译时求值。

不知道 "sv" 技巧!这正是我在寻找的东西。 - eof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接