C++ 预处理器 : Iterate over comma-separated list argument

标签 c++ c-preprocessor

我正在尝试生成给定类型的逗号分隔 vector 列表来实例化 vector 的 std::variant 。 (我不想编写大量的一行代码,所以我决定使用宏。我愿意接受针对这个根本问题的新建议)。

是否可以编写宏来定义一个预处理器变量,该变量看起来是给定类型的逗号分隔 vector 的列表:

#define INTEGRAL_TYPES char, int, long long, size_t
#define MAGIC_MACRO(x) ???

#define SEQUENTIAL_TYPES MAGIC_MACRO(INTEGRAL_TYPES) // this will generate std::vector<char>, std::vector<int>, std::vector<long long>, std::vector<size_t>

最佳答案

这可以使用 C++ 模板来完成:

#include <variant>
#include <vector>

template<typename... Types>
using VariantVectorGenerator = std::variant<std::vector<Types>...>;

using MyWeirdVariantVectorThing = VariantVectorGenerator<int, double, float>;

int main() {
    MyWeirdVariantVectorThing x;
    x = std::vector{42};
    x = std::vector{13.2};
}

在这种情况下,int、double、float 可以移动到宏中。不确定可以简化到什么程度。

关于C++ 预处理器 : Iterate over comma-separated list argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67120260/

相关文章:

c++ - 为什么 crtp 适用于结构而不适用于类?

c++ - 使用 C++ 和 Windows API 以编程方式更改墙纸

c++ - 大负数乘以 -1 给出输出负数 C++

Cuda代码#define错误,预期为 ")"

c - 预处理器不使用定义的散列值,而是使用宏的定义字符串

Objective-C使用#import和继承

成员相互引用的 C++ 类

c++ - 使用 fork() 与 exec() 创建新进程

c++ - 无法在 OpenGL 中随时间改变颜色

java - #if 在 Java 中,就像在 C 预处理器中一样