-4

再会,

我想通过使用变量来存储其名称来引用函数中的结构。这有可能在 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 switch,在每种情况下都直接引用结构,但是这部分代码是由非程序员自己提供结构的,我会向他提供结构初始化代码模板,他会将初始化代码添加到代码中的指定位置,修改允许名称列表并编译库。

4

2 回答 2

1

您不能将 achar或 a char const *(运行时数据)转换为类型(编译时信息)。

[编辑]好吧,实际上你可以使用类似下面的代码,但由于它使用模板,它仍然只在编译时可用,所以你将无法传递函数参数,例如。

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;
于 2013-03-02T22:04:35.707 回答
0

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

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

  1. 用户输入对应于特定的变量名称。
  2. 您实际上并不想要变量的“名称”,而只需要一种将不同数据与代码的不同部分相关联的方法。

在第二种更简单的情况下,只需使用数组,并使用您想要的元素的索引作为关联正确数据的方式。

在第一种情况下,您可以使用std::map<std::string, structname&>. A 的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;
}
于 2013-03-02T22:51:05.480 回答