将泛型结构作为接口中的参数传递

Passing a generic struct as a parameter in an interface

本文关键字:参数传递 接口 泛型 结构      更新时间:2023-10-16

在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,因此我不能只定义一个特定的类型。

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

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

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

然后,您只需通过接口传递MessageBase&

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

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

为什么不将接口定义为模板?

template<typename T>
class Interface
{
  public:
    virtual ~Interface() { }
    virtual void Receive(Message<T>& message) = 0;
    virtual Message<T> Send() = 0;
};