通过变量名寻址变量

Adressing variables by variable names

我目前正在编写一个 ROS 2 节点以通过 ROS 将值从 PLC 传递到可视化:

PLC系统-->ROS-->可视化

由于ROS应该只传递数据,所以我希望能够尽可能少地配置这里的接口。这个想法可以用 ROS 最好地实现,它是一个配置文件(.msg 文件),其中输入了变量的名称及其类型。其他一切都由此而来。 我不可避免地 运行 遇到的问题是:在 ROS 中,数据是通过所谓的消息传递的。这些消息是通过结构定义的,并从我的配置文件中自动生成。要为结构中的变量赋值,我不想处理程序中硬编码的每一个变量,而是使用已知名称遍历结构。

TLNR:变量可以用变量名来寻址吗?

我知道整件事听起来有点混乱。我希望下面的例子能阐明我的意思:

#include <vector>
#include <string>

struct MsgFile
{
    int someVariable;
    int someOtherVariable;
};

using namespace std;

class Example
{
public:
    vector<string> variableNames{"someVariable", "someOtherVariable"};
    MsgFile message;

    void WriteVariables()
    {
        for (auto const &varName : variableNames)
        {
            message."varName" = 0;  //<-- pseudo code of what I'm thinking of     
        }
    }
};

问候 蒂尔曼

你不能这样使用变量名。运行时没有变量名。如果你想要名称(字符串)和变量之间的映射,你需要自己添加。

如果您的“变量”属于同一类型,例如int,您可以使用地图:

#include <vector>
#include <string>
#include <unordered_map>    

using MsgFile = std::unordered_map<std::string,int>;


struct Example {
    std::vector<std::string> variableNames{"someVariable", "someOtherVariable"};
    MsgFile message;

    void WriteVariables() {
        for (auto const &varName : variableNames) {
            message[varName] = 0;  // add an entry { varName, 0 } to the map
                                   // (or updates then entry for key==varName when it already existed)
        }
    }
};

如果您只需要字符串表示来访问它(而不是用于打印等),您可以考虑使用枚举作为键。至少我会定义一些常量,比如 const std::string some_variable{"some_variable"},以避免打字错误被忽视(也许 variableNames 应该是 const(和 static?))。

据我所知,没有标准的方法可以做到这一点,我会选择另一种方式来存储数据(我的意思是不在 struct 中),但如果你坚持不懈,这里有一个已回答的问题: Get list of C structure members