c++ - 将通用结构作为接口(interface)中的参数传递

标签 c++ templates parameters struct

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

我能想到的解决这个问题的唯一方法是撕掉模板并使用继承,但是我会在我的代码中乱扔东西,比如 IntMessageBoolMessage ,看起来格外难看。关于如何按照我想要的方式执行此操作有什么想法吗?

最佳答案

一个简单的方法是将 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/

相关文章:

c++ - 具有常量表达式 : error C2975 with VC++2008 的模板

c++ - 具有成员函数指针的模板的默认值

database - 在模板中使用 Django 链 如何?

sql-server - 如何在SSIS中调用存储过程?

c++ - 将提取的字符存储在字符串 vector 中

c++ - 使用 g++ 4.6.1 我在尝试包含 xaudio2.h 时遇到许多 C++ 编译错误

c++ - OpenCV 3.2.0 : Reading Canny image for training SVM

c++ - 模板参数 - 带有可变参数的函数指针

用于搜索的 RESTful URL 样式指南

c++ - 按值传递或按引用传递