美好的一天,
我想通过使用变量来存储其名称来引用函数中的结构。这可能在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开关,在每种情况下直接引用结构,但代码的这一部分可以由非程序员扩展,他们自己提供结构,我会向他提供一个结构初始化代码的模板,他会将初始化代码添加到代码中的指定位置,修改允许的名称列表并编译库。
答案 0 :(得分:1)
您无法将char
或char 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 ++中编译步骤的一部分。
通常,有两种方案可以解决您所描述的问题类型:
在第二种更简单的情况下,只需使用一个数组,并将索引用于所需的元素,作为关联正确数据的方式。
在第一种情况下,您可以使用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;
}