我面临一个问题,需要为 ros2 的 topic_name 和 msgs 制作一个 std::map,例如
// here is the question, how to declare the std::map, i.e. ref_maps;
std::map<std::string, std::tuple<SomeUncertainType, AnotherUncertainType>> ref_maps;
// one type
msgType1 msg1_t; // = ...with some value assigned;
msgType1::SharedPtr msg1_p; //-> ...with some value assigned, and notice, here is a SharedPtr
std::string topic_name1 = "t1"
// another type
msgType2 msg2_t;
msgType2::SharedPtr msg2_p;
std::string topic_name1 = "t2"
ref_maps[t1] = std::make_tuple(msg1_t, msg1_p);
ref_maps[t2] = std::make_tuple(msg2_t, msg2_p);
这是否可能或任何其他方法可以实现类似的结果? 与某些基类不同的是 ros2 msgTypes( 和 ::SharedPtr) ,这样我就可以声明 ref_maps ,如下所示:
std::map<std::string, std::tuple<MsgTypeBase, MsgTypePtrBase>> ref_maps;
如果需要使用一个类,该类的实例在任何给定时间都保存一种类型的值或其替代值(前提是它们已知),则标准解决方案是
std::variant
。
它本质上代表了一个类型安全的联合,它提供了一组成员和非成员函数,使一种类型和另一种类型之间的切换更简单。此外,值始终是静态分配的,避免了动态分配的内存和性能开销。
std::map<std::string, std::pair<std::variant<T1, T2>, std::variant<T1, T2>>>;
如果可能的类型对只有(T1,U1),(T2,U2),则可以按以下方式修改定义。
std::map<std::string, std::variant<std::pair<T1, U1>, std::pair<T2, U2>>>;