我有一个客户端用来Get()数据包的类.该数据包包含一个std :: vector,其类型在我的Interface类内部生成数据包之前是未知的(在此示例中,它取决于Packet :: type变量).
我想知道模板是否可以用于此,因为Packet类只是一个泛型类,其类型可以是几乎任何东西.
就我所能想到的,它的问题是客户端不知道它是什么类型的数据包,直到他获得数据包并查看Packet :: type成员.所以,这不会起作用,因为他无法声明Get()将返回的变量(?)
在这种情况下,模板可以优雅地使用吗?
我能想到的另一种选择是定义一个基类,并为每种类型创建一个子类.然后,Get()方法可以返回指向基类的指针.然后客户端可以简单地查看Packet :: type(packet-> type)并将其转换为适当的子类.但那有点乱?有更优雅的解决方案吗?
下面的代码粗略地演示了这个场景:
enum
{
T_FLOAT,
T_COMPLEX
} TYPE_ENUM;
// T can either be of type float or std::complex
template<typename T>
class Packet
{
public:
TYPE_ENUM type;
std::vector<T> data;
};
class Interface
{
public:
// Method that client calls to obtain the packet
Packet<> Get()
{
return queue.pop(); // return current packet in queue
}
private:
Queue<Packet> queue;
};
Run Code Online (Sandbox Code Playgroud)