首页 > 解决方案 > 用于检查变量是否等于可变参数之一的可变参数宏

问题描述

我目前正在中开发类似 WebGL 的 OpenGL 包装器,其中涉及验证参数是否实际有效。问题或多或少是,OpenGL 有一个 ton,我在这里并没有夸大某些函数的有效参数。 (一个天真的条件的图像(如果你感兴趣的话,可能是internalformat常量。我真的为其中一些写了一个 JS 表解析器/条件生成器)来说明我的观点。那是......)glTexImage2Dassert

这种检查的逻辑很简单:

bool check(const unsigned int var)
{
    return var == CONSTANT_1 || var == CONSTANT_2 || var == CONSTANT_...;
}

但是,根据上面的示例,这可以扩展到多达 84 个可能的常数,即……是的。而且我完全清楚宏不会将其减少到荒谬的数量,但它仍然会有所作为,而且我觉得它也会更干净。更不用说具有不同运算符的其他类似方式的宏的可能性。

所以我的想法是使用宏。毕竟,使用std::initializer_list``, std::vector , std::array` 或其他容器在运行时进行此检查将是微不足道的,但由于所有这些常量在编译时都是已知的,我觉得这似乎是不必要的。

由于可能的常量的数量是可变的,我认为没有办法不使用可变参数宏。然而我不知道我将如何做到这一点。我想到的一种可能的方法基本上是根据参数的数量重载宏(类似于 this),但这似乎不必要地复杂。

本质上,我正在寻找一个可以满足以下要求的宏:

MACRO(var, CONSTANT_1, CONSTANT_2, CONSTANT_3)

扩展到

var == CONSTANT_1 || var == CONSTANT_2 || var == CONSTANT_3

具有任意数量的常量(重要!和困难的部分)。

标签: c++algorithmtemplatesmacrosc++17

解决方案


您可能想使用 C++17折叠表达式

template<class... Args>
bool check(const unsigned int var, const Args&... args)
{
  return ((var == args) || ...);
}

然后你可以调用这样的东西:

check(var, CONSTANT_1, CONSTANT_2, CONSTANT_3);

推荐阅读