通过变量名寻址变量
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
我目前正在编写一个 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