为结构变量动态赋值

Posted

技术标签:

【中文标题】为结构变量动态赋值【英文标题】:Dynamically assigning value to structure variable 【发布时间】:2015-07-18 19:12:13 【问题描述】:

我正在尝试将文件中的值动态分配给结构中的变量,但不知道该怎么做。我有一个结构:

struct abc 
 int age = 0;
 string name = "whatever";
 *ABC;

我还有一个函数可以循环读取可以读取这些值的文件,因此我最终会得到包含变量名称及其需要更新的值的行。因此,例如,我最终可能会得到两个变量,例如:

KEY="age"
VAL="21"

在它处理以下文件的第一行之后:

age|21
name|bill

如何将 VAL 值分配给 ABC 结构变量 KEY?

谢谢!

更新:

所以我想做类似的事情:

ABC.KEY = VAL

意义

ABC.age = 21

【问题讨论】:

abc 结构中的键在哪里? KEY和name意思一样吗?您正在考虑分配 abc v; v.name = "年龄"; v.age=stoi ("21");适当地。顺便说一句,用大写字母声明类型是一种好习惯。但是问题有点不清楚。 @Robert 感谢您的回复!给出示例,我不会使用 ABC.age 和 ABC.name 访问变量吗?是的,KEY 在处理文件各自的行时最终将具有“年龄”和“姓名”的值。 @InQusitive KEY 只是一个为处理文本文件中的值而创建的变量。 您可以使用检查类型并设置值的函数 【参考方案1】:

您要查找的内容称为反射,而 C++ 不提供此功能。

如果要将键与结构的成员匹配,则必须自己构建结构和函数。

例如,你可以这样考虑:

std::unordered_map<std::string, std::function<void(std::string, abc&)>> mapping;
mapping["age"] = [](std::string str, abc& a)  a.age = std::stoi(str); ;
mapping["name"] = [](std::string str, abc& a)  a.name = str; 

现在你可以像这样使用地图了

abc output;
auto key = ...;
auto value = ...;
if (mapping.find(key) == mapping.end())
    throw ...;
mapping[key](value, output);

【讨论】:

谢谢小狗。我所看到的一切都试图设置对象和各种东西。我只是想让事情尽可能简单。一个简单的函数会是什么样子来完成我所追求的? 你想做的并不简单,所以没有这回事。最容易使用的结构需要构建从一个到另一个的映射,该映射易于导航。 真的吗?!我之前成功地使用了地图,但被告知这不是一个好选择。我改用结构,现在看来我已经用一个问题换另一个问题了。 不确定我是否遵循您的建议 - “构建从一个到另一个的映射”? 嗯,这种方法并不涉及在地图中实际存储数据。它仅使用映射来定义输入键与结构成员的关系。解析完输入后,您可以将地图扔掉。你程序的其他部分不需要知道你是如何得到结构中的值的。此外,与读取文件相比,几次地图查找不会变慢。

以上是关于为结构变量动态赋值的主要内容,如果未能解决你的问题,请参考以下文章

结构体变量初始化问题

为结构变量赋值

为结构变量赋值

动态变量名 php 7.4 和赋值

JMeter——运用BeanShell给自定义的变量动态赋值

变量的结构赋值