【问题标题】:Is it really impossible to make a string into a variable in c++ [closed]在c ++中将字符串变成变量真的不可能吗[关闭]
【发布时间】:2014-08-01 03:35:22
【问题描述】:

Convert string to variable name or variable typeHow to use a string as a variable name in C++? 的答案都表示在编译后您不能将字符串用作变量。但是,他们提到python等高级语言可以。据我了解,Python 是从 https://softwareengineering.stackexchange.com/questions/20988/why-is-python-written-in-c-and-not-in-c 用 C 语言编写的。

所以如果python是用C写的,而且它可以使用字符串作为变量,那为什么人们不能用C++来做呢。

我猜这个问题不清楚。从 cmets 中的类比来看,

如果 Python 是由 C 制成的,我会假设编写了一些函数允许 Python 是动态的。那么,为什么不能在没有 Python 的所有其他部分的情况下编写该功能。

【问题讨论】:

  • @user1938107 仅仅因为语言 A 是用语言 B 编写的,并不意味着语言 B 是语言 A 的超集。可以想象,我可以使用旧的非 OO Visual Basic 编写 C++ 编译器。甚至是更好的例子——一些 C++ 编译器是用 C 编写的。C 有虚函数或模板吗?
  • “如果python是用C写的,而且它可以使用字符串作为变量,那为什么人们不能用C++来做呢。” ——房子是砖砌的。砖可以堆叠。那么房子为什么不能叠起来呢?
  • Fortran 用于导航早期的宇宙飞船。那么为什么 Fortran 不能绕地球运行呢?
  • 每一种 编程语言都作为机器代码执行。因此,每种语言编程都必须相同。请有一些常识。
  • 您显然想要回答的问题是“您可以将字符串映射到 C++ 中的值吗?”答案当然是肯定的,下面的一些答案说明了如何。

标签: c++ c string compile-time


【解决方案1】:

CPython 实现 - 用 C 编写的 Python 实现 - 使用 C 语言来实现某种变量查找,使 Python 的行为类似于 Python,而不像 C 或 BASIC。

因此,您当然可以使用 C 或 C++ 来实现字符串命名的变量查找。只是不要期望 编译器 能够识别它,因为它不是 C/C++ 语言的一部分。不过,最终产品(编译后的可执行文件)将支持这一概念。

例如,在 C++ 中,使用 Boost:

std::map<std::string, boost::variant<std::string, int>> _;

_["name"] = "user";
_["index"] = 1938107;

std::cout << _["name"] << _["index"] << std::endl;

输出:

user1938107

如果没有现成的类可以帮助您,您还可以使其与编译器已知的常规变量互操作。

【讨论】:

    【解决方案2】:

    编译 C++ 程序时,变量名称不会放入生成的可执行文件中。一旦编译器弄清楚了所有内容,它们就会被丢弃。剩下的只是非常低级的汇编语言指令和内存地址。因此,该语言从根本上以一种不允许您想要的方式进行设计。

    其他一些语言,如 Python,会保留名称信息。它们的编译方式与 C++ 不同。在运行时通常会有更多的解释。在某个基本层面上,Python 程序中的变量可能以某种底层数据结构结束——也许是名称到值的映射。这样该语言就可以支持动态查找等变量名称。

    因此,充其量在 C++ 中,您可以以类似的方式设计自己的数据结构或框架 - 保存具有关联名称的数据,然后能够按名称查询以检索相关数据。 (或者,当然,你可以搜索已经实现了这样的东西的其他人。)

    【讨论】:

      【解决方案3】:

      螺丝刀不能钻孔。但是你可以用螺丝刀来做一个钻头。

      【讨论】:

      • 我不相信这是一个答案。
      • 我已经用螺丝刀钻孔了... ; )
      【解决方案4】:

      在另一种方式中,我认为您可以使用一些技巧从字符串或其他东西创建一些类型的变量,例如在工厂设计模式中,但是,这不是语言功能,您需要注册类型的名称和类型的首先是创建者函数。

      std::map<string, creating_function> lookup_table;
      lookup_table["class_1"] = &class_1_creator;  // register type and creator
      
      obj_instance& Create(string type_name, parameters_passed_to_the_creator) // create a variable
      {
          return lookup_table[type_name](parameters_passed_to_the_creator);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多