c++ 有没有一种方法可以“模式匹配”到变量名中?

dbf7pr2w  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(155)

我提前道歉,这将是一个愚蠢的问题,但我不知道如何措辞谷歌搜索以及得到回应。
现在我偶尔会想到这个问题,每次如果它存在的话,它会让我的代码更容易写,假设我有两个向量:vec0<int>vec1<int>(为了示例的目的)。
有没有类似下面代码行的方法?假设我们想把偶数压入vec0,把奇数压入vec1。

for(int i=0;i<=n;i++)
turnStringIntoVariable(f"vec{i%2}").push_back(i)

所以一个函数会计算变量的名字并获取它的地址,然后你可以对结果执行操作。
实际上有这样的事情吗?这纯粹是出于好奇,真的。

ruyhziif

ruyhziif1#

这在C中是不可能做到的。在C核心语言级别,无论是在运行时还是在编译时,都没有办法将字符串转换为相应的符号(例如引用变量)。
在编译时的预处理器阶段,对类似内容的支持是有限的,但语法不像您想要的那样。
在运行时,就像你所展示的,这基本上是不可能的,因为C是静态类型的,所以表达式的类型不能依赖于运行时的值,并且因为实体的名称在C中是纯粹的编译时概念,它们在运行时不存在(实际上,变量本身也不存在)。
如果你想在C++中将字符串Map到变量,你需要显式地提供一对一的Map,例如std::map<std::string, /*shared type of variables*/>,或者通过编写一个函数来显式地包含Map,作为控制流的一部分。
但这几乎肯定是低效的,例如在你的例子中,你可能真的想使用一个变量模板或者一个fold表达式,它可以重复地将i和变量对应用到表达式中。(尤其是可变值的)和常见的习惯用法,如使用带元组的std::applystd::index_sequence生成编译-对应于模板参数包元素的时间数字序列,以便它们可以在折叠表达式中一起使用。
或者,只要所有的vecX都具有相同的类型,就不需要像模板这样花哨的东西,一个简单的数组就足够了:

std::array vecs = {std::ref(vec1), std::ref(vec2), std::ref(vec3)};
for(int i=0;i<vecs.size();i++)
    vecs[i].get().push_back(i);

相关问题