C++ 如何将字符串变量视为实际代码?

C++ 如何将字符串变量视为实际代码?,c++,string,function,metaprogramming,C++,String,Function,Metaprogramming,这可能不是很清楚。假设我有一个char*a=reg。现在,我想写一个函数,在读取a的值时,实例化一个特定类的对象,并将其命名为reg 例如,假设我有一个类寄存器和一个单独的函数createchar*。我想要这样的东西: void create(char *s) //s == "reg" { //what goes here? Register reg; // <- this should be the result } 它应该是可重复使用的: void create(

这可能不是很清楚。假设我有一个char*a=reg。现在,我想写一个函数,在读取a的值时,实例化一个特定类的对象,并将其命名为reg

例如,假设我有一个类寄存器和一个单独的函数createchar*。我想要这样的东西:

void create(char *s)  //s == "reg"
{
    //what goes here?
    Register reg;  // <- this should be the result
}
它应该是可重复使用的:

void create(char *s)  //s == "second"
{
    //what goes here?
    Register second;  // <- this should be the result
}
我希望我已经说清楚了。本质上,我希望将变量中的值作为单独的变量名处理。这在C/C++中可能吗?如果没有,有什么相似的吗?我目前的解决方案是对字符串进行散列,散列表将在该位置存储相关的寄存器对象,但我认为这是非常不必要的


谢谢

这是不可能的。C++在运行时不提供任何处理代码的工具。给定一个典型的C++实现的特性,它编译成预先编译机器代码,丢失了关于源代码的所有信息,这甚至不是遥不可及的。它们在运行时不存在。在C++中创建动态命名变量是没有意义的。你怎么说呢

假设您有一个假设的create函数,并编写了如下代码:

create("reg");
reg.value = 5;
这不会编译,因为编译器不知道reg在第二行中引用了什么

C++没有任何方法在运行时查找变量,因此在运行时创建变量是一件不容易的事情。哈希表是解决这个问题的正确方法。将对象存储在哈希表中,并按名称查找它们。

如我在评论中所说: 重点是什么?变量名是编译器的东西,但最重要的是,程序员应该关心它。一旦应用程序被编译,变量名可以是任何。。。它可能会被弄坏,变得毫无意义,不再重要了。 您可以读/写代码,包括var名称。一旦编译完成,就要由硬件来处理了

C和C++都没有EVA函数 原因很简单:您只编译您需要的内容,eval意味着以后可能没有意义的输入,或者需要其他依赖项。 C/C++是提前编译的,eval意味着在运行时进行计算。然后,C进程将意味着:预处理、编译和链接字符串,这样它仍然是当前进程的一部分。。。 即使有可能,eval也总是被认为是邪恶的,这对于像C系列这样的语言来说是双重的,因为它们意味着可靠地运行,并且经常用于时间关键型操作。这项工作的正确工具以及所有这些

使用具有哈希、键、寄存器和冲突成员的对象的哈希表是明智的做法。反正也没那么多开销

还是觉得你需要这个?
查看大量的脚本语言。Perl、Python。。。它们都更适合做这类事情

如果您需要一些变量创建和查找,您可以:

按照其他人的建议,使用其中一种脚本语言 自己进行显式查找。最简单的方法是使用映射,将字符串映射到寄存器对象。然后你可以有:
显然,每次您想要访问以这种方式创建的变量时,都必须通过调用lookup

如果你能用这个字符串作为某种地图的键,那就很方便了。你不同意吗?你不能在C++中这样做,因为它不支持动态性到必要的程度。你想解决的实际问题是什么?为什么?为什么你会让程序员以外的人来决定你的变量叫什么?你可以选择你的变量名,但是一旦代码被编译,这些名字就消失了。。。无论如何,我看不出重点,但要回答:一个包含哈希、char*和Register成员的哈希表听起来是明智的选择……JavaScript是适合您的语言,尽管我要提醒你,这个问题听起来很像你在问如何使用螺丝刀将一块木板切成两半的问题,而你首先真正需要的是一个钻头。描述你正试图用这种疯狂的技术解决的业务问题。可能有一个比你想的更好的解决方案。@PeterM:我不一定指类,它也可以是基本数据类型或结构。
std::map<const char*, Register*> table;

Register* create(const char* name) {
    Register* r = new Register();
    table[name] = r;
    return r;
}

Register* lookup(const char* name) {
    return table[name];
}

void destroy(const char* name) {
    delete table[name];
    table.erase(name);
}