C++ 根据输入从一种类型转换为另一种类型

C++ 根据输入从一种类型转换为另一种类型,c++,c++17,C++,C++17,我正在尝试在两个网络之间创建一个代理。我想做一些类似的事情: void onMsgstd::字符串主题,Msg{ 如果主题==主题1{ InMsg1-InMsg1=parseMsg1msg; OutMsg1-OutMsg1=convertinmsg1; 出版主题,outmsg1; } //对需要转换的每种消息类型重复此操作。 因此,我不能使用模板,因为类型取决于主题。如果我可以创建一个具有以下内容的映射,并让它查找它,那就太好了。我知道我不能在映射中使用类型,只是一个示例 标准::映射_映射={

我正在尝试在两个网络之间创建一个代理。我想做一些类似的事情:

void onMsgstd::字符串主题,Msg{ 如果主题==主题1{ InMsg1-InMsg1=parseMsg1msg; OutMsg1-OutMsg1=convertinmsg1; 出版主题,outmsg1; } //对需要转换的每种消息类型重复此操作。 因此,我不能使用模板,因为类型取决于主题。如果我可以创建一个具有以下内容的映射,并让它查找它,那就太好了。我知道我不能在映射中使用类型,只是一个示例

标准::映射_映射={ {topic1,{InMsg1,OutMsg1}, {topic2,{InMsg2,OutMsg2}, {topic3,{InMsg3,OutMsg3} } 有谁能给我一些建议或者至少是一些我可以参考的设计模式吗


作为参考,我正在从MQTT转换为ROS消息。因此,我需要根据接收消息的主题解析MQTT消息,然后在ROS端发布相同的主题。

首先,将代理逻辑提取到模板函数中:

template <class InMsg, class OutMsg>
void proxy(std::string topic, Msg msg) {
    InMsg inmsg = parseMsg<InMsg>(msg);
    OutMsg outmsg = convert<InMsg, OutMsg>(inmsg);
    publish<OutMsg>(topic, outmsg);
}

首先,将代理逻辑提取到模板函数中:

template <class InMsg, class OutMsg>
void proxy(std::string topic, Msg msg) {
    InMsg inmsg = parseMsg<InMsg>(msg);
    OutMsg outmsg = convert<InMsg, OutMsg>(inmsg);
    publish<OutMsg>(topic, outmsg);
}
这就是目的:表示一组已知类型的值

您的传入消息是一个std::variant。您的传出消息是一个std::variant。从一个到另一个的转换应通过完成

这就是目的:表示一组已知类型的值

您的传入消息是一个std::variant。您的传出消息是一个std::variant。从一个到另一个的转换应通过完成


老实说,我不太理解类型问题。但是你可以做一些事情:使用映射到std::variant。并在运行时检查变量类型。或者构建一个超类并从中派生类型。你可以使用多态性。只需创建一个MessageTranslator类并为每种不同类型的消息创建子类。然后映射到图片到适当的转换器。老实说,我不太理解类型问题。但这里有一件事你可以做:使用到std::variant的映射。并在运行时检查变量类型。或者构建一个超类并从中派生类型。你可以使用多态性。只需创建一个MessageTranslator类并为每个不同的类型创建子类一种消息。然后从主题映射到相应的翻译。这基本上就是我现在正在做的。我想知道是否有一种方法可以做到这一点,而不必在每次添加新主题时为每个部分添加块parseMQTT、to_ros_msg、if topic==,等等。但现在似乎没有一种好方法可以做到这一点。这是basi凯莉:我现在正在做什么。我想知道是否有一种方法可以做到这一点,而不必每次添加新主题时都为每个部分添加一个块parseMQTT、to_ros_msg、if topic==,等等。但现在似乎没有一种好方法可以做到这一点。
auto it = handlers.find(topic);
if (it != handlers.end()) {
    (it->second)(topic, msg);
}
// or
handlers[topic](topic, msg);

using Incoming = std::variant<type1, type2, ...>;

// converting from mqtt to 'internal' type using
// template specialization
template<T> T parseMqtt(const mqttmsg &msg);
type1 parseMqtt<type1>(const mqttmsg &msg) {
  return {...};
}
type2 parseMqtt<type2>(const mqttmsg &msg) {
  return {...};
}
// dispatch using a type identifier
Incoming parseMqtt(const std::string &topic, const mqttmsg &msg) {
  ...
  if(topic == "topic 1") { return parseMqtt<type1>(msg); }
  if(topic == "topic 2") { return parseMqtt<type2>(msg); }
  ...
}

// converting from 'internal' type to ROS using
// overloads:
ros_message to_ros_msg(const type1 &msg) {
  return {...};
}
ros_message to_ros_msg(const type2 &msg) {
  return {...};
}

// bringing it all together
auto mqtt_to_ros(const std::string &topic, const mqttmsg &msg) {
  const auto &incoming = parseMqtt(topic, msg);
  const auto &outgoing = std::visit(
     [](const auto &msg) { return to_ros_msg(msg); }
     , incoming);
  ros_send(outgoing);
}