Convert string to variable name or variable type和How 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语言编写的,并且它可以使用string作为变量,那么为什么人们不能在C ++中这样做。
我想问题不明确。从评论中的类比来看,
如果Python是用C语言编写的,我会假设编写了一些允许Python动态化的函数。那么为什么不能在没有Python的所有其他部分的情况下编写该功能。
答案 0 :(得分:3)
编译C ++程序时,变量名称不会放入生成的可执行文件中。一旦编译器发现了所有内容,它们就会被丢弃。留下的只是非常低级的汇编语言指令和内存地址。因此,语言的基本设计方式不能满足您的需求。
其他一些语言(如Python)会保留名称信息。它们的编译方式与C ++不同。在运行时通常会有更多的解释。在某些基础层面,Python程序中的变量可能最终会出现在某种底层数据结构中 - 可能是名称到值的映射。这样,该语言可以支持动态查找和变量名称。
最好在C ++中,您可以以类似的方式设计自己的数据结构或框架 - 保存具有关联名称的数据,然后能够按名称查询以检索相关数据。 (或者当然,你可以搜索已经实现过此类事情的其他人。)
答案 1 :(得分:3)
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 :(得分:0)
螺丝刀不能钻孔。但是你可以用螺丝刀来制作钻头。
答案 3 :(得分:0)
另一方面,我认为您可以使用某些技巧从字符串或某些东西创建一些TYPE变量,例如在工厂设计模式中,但是,这不是语言功能,您需要注册类型的名称和类型首先创建函数。
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);
}