当前位置:  开发笔记 > 编程语言 > 正文

在这种情况下应该使用C++模板吗?

如何解决《在这种情况下应该使用C++模板吗?》经验,为你挑选了2个好方法。

我有一个客户端用来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
class Packet
{
public:
  TYPE_ENUM       type;
  std::vector  data;
};

class Interface
{

public:
  // Method that client calls to obtain the packet
  Packet<>  Get()
  {
    return queue.pop(); // return current packet in queue
  }

private:
  Queue   queue;
};

Rob Walker.. 8

模板都是关于编译时类型解析...如果在运行时之前无法确定类型,那么您就不适合应用模板.

您将需要按照您的描述对最终数据包类型进行运行时切换.



1> Rob Walker..:

模板都是关于编译时类型解析...如果在运行时之前无法确定类型,那么您就不适合应用模板.

您将需要按照您的描述对最终数据包类型进行运行时切换.



2> 1800 INFORMA..:

对数据包类型的操作使用抽象基类和虚方法.您不应该转换数据包类.模板类的集合是有问题的 - 您将无法添加和删除项目.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有