我提前道歉,这将是一个愚蠢的问题,但我不知道如何措辞谷歌搜索以及得到回应。
现在我偶尔会想到这个问题,每次如果它存在的话,它会让我的代码更容易写,假设我有两个向量:vec0<int>
和vec1<int>
(为了示例的目的)。
有没有类似下面代码行的方法?假设我们想把偶数压入vec0,把奇数压入vec1。
for(int i=0;i<=n;i++)
turnStringIntoVariable(f"vec{i%2}").push_back(i)
所以一个函数会计算变量的名字并获取它的地址,然后你可以对结果执行操作。
实际上有这样的事情吗?这纯粹是出于好奇,真的。
1条答案
按热度按时间ruyhziif1#
这在C中是不可能做到的。在C核心语言级别,无论是在运行时还是在编译时,都没有办法将字符串转换为相应的符号(例如引用变量)。
在编译时的预处理器阶段,对类似内容的支持是有限的,但语法不像您想要的那样。
在运行时,就像你所展示的,这基本上是不可能的,因为C是静态类型的,所以表达式的类型不能依赖于运行时的值,并且因为实体的名称在C中是纯粹的编译时概念,它们在运行时不存在(实际上,变量本身也不存在)。
如果你想在C++中将字符串Map到变量,你需要显式地提供一对一的Map,例如
std::map<std::string, /*shared type of variables*/>
,或者通过编写一个函数来显式地包含Map,作为控制流的一部分。但这几乎肯定是低效的,例如在你的例子中,你可能真的想使用一个变量模板或者一个fold表达式,它可以重复地将
i
和变量对应用到表达式中。(尤其是可变值的)和常见的习惯用法,如使用带元组的std::apply
和std::index_sequence
生成编译-对应于模板参数包元素的时间数字序列,以便它们可以在折叠表达式中一起使用。或者,只要所有的
vecX
都具有相同的类型,就不需要像模板这样花哨的东西,一个简单的数组就足够了: