首页 > 解决方案 > 检查宏参数是允许的参数之一吗?

问题描述

我想完成类似以下的事情:

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

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

标签: c++c++17

解决方案


您可以使用字符串视图。

#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调用文字运算符。它构造一个std::string_viewfrom "foo"std::string_view具有用于与字符串进行比较的重载==运算符。这些重载的运算符constexpr意味着它们可以在编译时进行评估。


推荐阅读