3

在 C++ 中,假设我有一个将消息包装在通用结构中的消息传递系统:

template<typename T>
struct Message
{
  std::string Name;
  T Data;
};

我还有一个接口,其中包含需要使用此结构的纯通用版本的函数:

class Interface
{
  public:
    virtual ~Interface() { }
    virtual void Receive(Message& message) = 0;
    virtual Message Send() = 0;
};

但是,Message不再命名类型;诸如Message<float>Message<std::string>名称类型之类的东西。由于将要实现的类Interface想要捕获不同Message的 ,我不能只定义一个特定的类型。

我能想到解决这个问题的唯一方法是撕掉模板并使用继承,但是我会在我的代码中乱扔诸如 and 之类的东西IntMessageBoolMessage这看起来非常难看。关于如何以我想要的方式做到这一点的任何想法?

4

2 回答 2

2

一种简单的方法是将Message类型拆分为层次结构:

struct MessageBase {
  std::string Name;
};
template<typename T>
struct Message : MessageBase
{
  T Data;
};

然后你可以MessageBase&通过接口。

[前面的不行。该函数将能够接受任何MessageBase&对象,但Receive似乎是关于在参数中存储一条编译时类型未知的消息。虽然如果您不介意动态分配,您可以拥有一个Message包含名称和一个指向 a 的指针MessageBase,然后是MessageImpl(上面的模板)的不同实现]

另一种常见的方法是将所有可能的消息添加到联合并传递联合。

于 2012-10-04T18:53:51.923 回答
1

为什么不将您的界面定义为模板?

template<typename T>
class Interface
{
  public:
    virtual ~Interface() { }
    virtual void Receive(Message<T>& message) = 0;
    virtual Message<T> Send() = 0;
};
于 2012-10-04T18:46:11.437 回答