【问题标题】:Convert string to variable name or variable type将字符串转换为变量名或变量类型
【发布时间】:2011-10-31 20:52:00
【问题描述】:

是否可以通过执行以下操作将字符串转换为变量(反之亦然):

makeVariable("int", "count");

string fruit;
cin >> fruit;    // user inputs "apple"
makeVariable(fruit, "a green round object");

然后可以通过执行以下操作来访问它:

cout << apple; //a green round object

提前致谢!

【问题讨论】:

标签: c++ string


【解决方案1】:

不,这是不可能的。这种功能在 Ruby 和 Python 等脚本语言中很常见,但 C++ 的工作方式与这些语言大不相同。在 C++ 中,我们尝试在compile time 上尽可能多地完成程序的工作。有时我们可以在runtime 做事情,即使这样,优秀的 C++ 程序员也会在编译时找到一种方法来完成这项工作。

如果您知道要创建一个变量,请立即创建它:

int count;

您可能提前不知道变量的值,因此您可以将其推迟到运行时:

std::cin >> count;

如果您知道您将需要一组变量,但不知道其中有多少,请创建一个 mapvector

std::vector<int> counts;

请记住,变量的名称只不过是一个名称——一种供您稍后引用该变量的方式。在 C++ 中,不可能 也不在运行时推迟分配变量的名称是有用的。这样做只会让你的代码更复杂,让你的程序更慢。

【讨论】:

  • @Flyphe -- 完全有可能制作一个根据输入改变它所做的程序;在程序运行时,不可能制作一个为数据创建新名称的程序。要意识到的关键是这些名称——变量名称——只存在于源代码中,并且在程序运行时没有任何功能。创造新的将毫无用处。地图、向量、数组、列表等可以根据用户输入保存任意数量的任意数据,但这与创建新变量无关
  • 当然是。只是在 C++ 中无法在运行时创建变量。在 C++ 中,代码和数据之间有明显的区别。代码在编译时被烘焙;数据可以在运行时被烘焙或获取。优秀的 C++ 程序员总是会在编译时尝试尽可能多的工作,因为这意味着在运行时要做的工作更少,这反过来意味着你的程序更快。这也是 C++ 程序具有这种速度声誉的原因。我们在编译时烘焙变量,所以在运行时剩下要做的就是填充它们。
【解决方案2】:

至少对于(反之亦然)预处理器语句 stringify # 有可能。请参阅this answer,了解如何将 C++ 变量名转换为字符串。

【讨论】:

    【解决方案3】:

    好吧,我猜你不能制作动态变量,但你可以使用一些函数在任何外部文本文件中写入一个新变量及其值,并在需要时从该文件中访问它的值(你也可以删除动态变量通过从文本文件中删除它。)

    理论:变量是我们存储数据的内存位置,由名称标识,如果处理器不允许我们将数据存储在寄存器中,我们可以将数据存储在文本文件中,并且我们可以通过搜索其标识来访问它的值(变量名) int 文本文件,我们的数据将在它旁边。

    这只是一个想法,它应该可以工作,但我想它不会很简单,而且你的程序必须在速度方面付出代价。

    【讨论】:

      【解决方案4】:

      初级程序员会针对每种语言提出这个问题。有一组计算机语言对这个问题的回答是“是”。这些是动态的交互式语言,例如 BASIC、Lisp、Ruby、Python。但是想一想:变量名只存在于代码中,为了程序员的方便。如果有人随后在新代码中键入变量的名称,那么在程序运行时定义一个新变量才有意义。这适用于交互式语言环境,不适用于 C++ 或 Java 等编译语言。在 C++ 中,当程序运行并创建虚构的新变量时,周围没有人可以键入使用该新变量的代码。

      您真正想要的是在运行时将名称与对象关联的能力,以便代码(而不是人)可以使用该名称来查找对象。正如其他人已经指出的那样,C++ 标准库的map 特性为您提供了这种能力。

      【讨论】:

      【解决方案5】:

      您可以使用地图。

      map<string, int> numbers;
      numbers["count"] = 6;
      cout << numbers["count"];
      

      【讨论】:

      • 是的,这很有用而且很好,但我想动态创建从“命令行”指定的变量
      • @Flyphe:你可以从cin读取那里使用的字符串(“count”)。
      【解决方案6】:

      没有。 C++ 是静态类型的,这与整个范式背道而驰。

      我之前已经看到通过将变量存储在 stl 映射中来实现这种类型的功能。

      【讨论】:

        【解决方案7】:

        你可能想看看C++ map

        【讨论】:

          猜你喜欢
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          • 2011-08-27
          • 2010-12-04
          • 2018-02-14
          • 1970-01-01
          相关资源
          最近更新 更多