在c++中真的不可能把字符串变成变量吗?



将字符串转换为变量名或变量类型以及如何在c++中使用字符串作为变量名?答案说,你不能使用字符串作为一个变量后,编译时间。然而,他们提到像python这样的高级语言可以。据我所知,Python是用C编写的https://softwareengineering.stackexchange.com/questions/20988/why-is-python-written-in-c-and-not-in-c。

所以如果python是用C写的,并且它可以使用字符串作为变量,那么为什么人们不能在c++中这样做呢?

我想这个问题不是很清楚。从注释中的类比来看,

如果Python是由C语言编写的,我会假设有一些函数允许Python是动态的。那么,为什么不使用Python的其他部分来编写这个功能呢?

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

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

当编译c++程序时,变量名不会放入结果可执行文件中。一旦编译器弄清楚了一切,它们就会被丢弃。剩下的都是非常低级的汇编语言指令和内存地址。因此,从根本上说,这种语言的设计方式不允许你想要的东西。

其他一些语言,如Python,保留了名称信息。它们的编译方式与c++不同。通常在运行时会有更多的解释。在某种基础级别上,Python程序中的变量可能最终存在于某种底层数据结构中——可能是名称到值的映射。这样语言就可以支持动态查找和变量名之类的。

所以在c++中,你最多可以用类似的方式设计你自己的数据结构或框架——用一个关联的名称保存数据,然后能够通过名称查询来检索相关的数据。(当然,您也可以搜索已经实现了这种东西的人。)

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

在另一种方式,我认为你可以创建一些类型的变量从字符串或使用一些技巧,像在工厂设计模式,但是,这不是一个语言特性,你将需要注册类型的名称和类型的创建者函数。

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);
}

最新更新