c++ - 用于检查变量是否等于可变参数之一的可变参数宏
问题描述
我目前正在c++中开发类似 WebGL 的 OpenGL 包装器,其中涉及验证参数是否实际有效。问题或多或少是,OpenGL 有一个 ton,我在这里并没有夸大某些函数的有效参数。
(一个天真的条件的图像(如果你感兴趣的话,可能是internalformat
常量。我真的为其中一些写了一个 JS 表解析器/条件生成器)来说明我的观点。那是......)glTexImage2D
assert
这种检查的逻辑很简单:
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++17折叠表达式:
template<class... Args>
bool check(const unsigned int var, const Args&... args)
{
return ((var == args) || ...);
}
然后你可以调用这样的东西:
check(var, CONSTANT_1, CONSTANT_2, CONSTANT_3);
推荐阅读
- python - Airflow + Cluster + Celery + SQS - Airflow Worker:“Hub”对象没有属性“_current_http_client”
- python - 当您输入变量名并希望它是一个整数以供以后计算时,如何使用输入函数?
- firebase - Firebase 用户已删除,但仍在设备上登录
- html - 如何在svg中创建一个椭圆
- c++ - 如何使用 uncrustify 缩进连续的函数参数?
- reactjs - 酶测试嵌套组件的方法
- javascript - Ext JS 6 经典图表 - 截断轴
- arrays - Node 6.10 JavaScript Map vs Slice 底层差异
- android - 如何在运行 am instrument 命令时生成 html 报告 - Uiautomator
- c# - ZXing,带有 TryInverted 颜色选项的 DataMatrix Reader 似乎不适用于 iOs (Xamarin.Forms)