如何通过存储在另一个变量中的名称来处理变量(C ++)

时间:2013-03-02 21:58:28

标签: c++

美好的一天,

我想通过使用变量来存储其名称来引用函数中的结构。这可能在C ++中做这样的事情吗?

当然,所有现有结构都将在进行任何调用之前声明和初始化(可能是全局的),我将构建一个检查以确保只引用现有结构。

我想要这种精神:

struct StructName
{
...stuff
}a,b,c;

StructName a;
StructName b;
.
.
.

等。包括设置所需的值(在初始化或代码中的其他地方根据需要)

然后我会从另一部分代码中调用这样的东西:

void myFunction(char someInput)
{
some stuff
some stuff
externalFunction(static parameter, static parameter, _someInput_, static parameter);
yet some other stuff
}

其中somInput是a,b或c。

请记住,我是C的初学者,在主题方面几乎没有接受过正式培训。

谢谢。

编辑:如果只是我自己,我会为someInput进行case开关,在每种情况下直接引用结构,但代码的这一部分可以由非程序员扩展,他们自己提供结构,我会向他提供一个结构初始化代码的模板,他会将初始化代码添加到代码中的指定位置,修改允许的名称列表并编译库。

2 个答案:

答案 0 :(得分:1)

您无法将charchar const *(运行时数据)转换为类型(编译时信息)。

[edit] 嗯,实际上您可以使用类似下面的代码,但由于它使用模板,它仍然只能在编译时使用,因此您将无法通过例如,函数参数。

template < char C >
struct GetType;

template < >
struct GetType< 'a' > {
    typedef struct { int foo; } type; };

template < >
struct GetType< 'b' > {
    typedef struct { int bar; } type; };

GetType< 'a' >::type foo;
GetType< 'b' >::type bar;

答案 1 :(得分:0)

变量名disappear,作为C和C ++中编译步骤的一部分。

通常,有两种方案可以解决您所描述的问题类型:

  1. 用户输入对应于特定变量名称。
  2. 您实际上并不想要变量的“名称”,而只需要一种方法将不同的数据与代码的不同部分相关联。
  3. 在第二种更简单的情况下,只需使用一个数组,并将索引用于所需的元素,作为关联正确数据的方式。

    在第一种情况下,您可以使用std::map<std::string, structname&>std::map行为类似于数组,但它由模板参数中的第一个类型给索引到std::map - 所以在这种情况下,您可以使用std::string作为索引。

    这样的事情:

    #include <map>
    #include <iostream>
    #include <string>
    
    struct StructName
    {
        int x;
    };
    
    std::map<std::string, StructName *> vars;
    
    StructName a;
    StructName b;
    
    void registerVars()
    {
        vars["a"] = &a;
        vars["b"] = &b;
    }
    
    
    int main()
    {
        std::string v;
    
        registerVars();
    
        while(std::cin >> v)
        {
        std::cin.ignore(1000, '\n');
    
        if (vars.find(v) == vars.end())
        {
            std::cout << "No such variable" << std::endl;
        }
        else
        {
            vars[v]->x++;
            std::cout << "variable " << v << " is " << vars[v]->x << std::endl;
        }
        }
        return 0;
    }