在 C++ 中,假设我有一个将消息包装在通用结构中的消息传递系统:
template<typename T>
struct Message
{
std::string Name;
T Data;
};
我还有一个接口(interface),其中包含需要使用此结构的纯通用版本的函数:
class Interface
{
public:
virtual ~Interface() { }
virtual void Receive(Message& message) = 0;
virtual Message Send() = 0;
};
然而,Message
不再命名类型;像Message<float>
之类的东西和 Message<std::string>
名称类型。由于将要实现的类 Interface
会想抓不一样的Message
, 我不能只定义一个特定的类型。
我能想到的解决这个问题的唯一方法是撕掉模板并使用继承,但是我会在我的代码中乱扔东西,比如 IntMessage
和 BoolMessage
,看起来格外难看。关于如何按照我想要的方式执行此操作有什么想法吗?
最佳答案
一个简单的方法是将 Message
类型拆分为一个层次结构:
struct MessageBase {
std::string Name;
};
template<typename T>
struct Message : MessageBase
{
T Data;
};
然后你可以通过接口(interface)传递MessageBase&
。
[前面的不行。该函数将能够接受任何 MessageBase&
对象,但 Receive
似乎是关于在参数中存储编译时类型未知的消息。尽管如果您不介意动态分配,您可以拥有一个包含名称的 Message
和一个指向 MessageBase
的指针,然后是 MessageImpl
的不同实现>(上面的模板)]
另一种常见的方法是将所有可能的消息添加到 union 并传递 union 。
关于c++ - 将通用结构作为接口(interface)中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733668/