【问题标题】:Interface for template methods模板方法的接口
【发布时间】:2013-04-13 04:55:01
【问题描述】:

我有一个类Foo,它提供了某种功能。为了保持模块化,Foo 是一个接口(即只有抽象方法的 C++ 类),而 Foo 的实现可以选择具体如何实现功能。但是,我的界面包含一个模板方法。也就是说,

class Foo
{
public:
        template<class T>
        void functionality(const T&);
};

C++ 中不可能有模板方法virtual。是否有任何技术可以使用模板方法实现类似的结果(模块化和多态性)?

【问题讨论】:

  • 您是否有一组有限的、预先确定的类型需要使用它? T 是否有任何属性,例如“必须是类整数类型”或“必须是类函子类型”或“必须是类数字类型”,您可以提供给我们吗?您是否需要通过特征类或类似支持的“第 3 方”扩展? 究竟functionality 做了什么?在这种情况下,性能到底有多重要? (而不仅仅是“我喜欢快速的东西”:即“这个函数必须在 60 hz 的 7 Mpx 图像上每个像素运行一次”)。算法是否基本忽略了T作为载体的价值?
  • Foo 实现了来自 N 个不同进程的 sendrecv 消息。我最初的实现是为每种消息类型使用一个消息队列,T 是可以作为消息发送的类(所有这些类都扩展了一个抽象类Message)。 sendrecv 这样的方法是模板的原因是,队列管理可以在编译时自动设置,并在运行时注册一些消息类型。我的愿望是,如果将来出于某种原因希望通过互联网而不是 IPC 进行通信。
  • 想象一个客户发明了一种新的类型Bob,它派生自Message。多年前编译的服务器不会知道Bob。所以它不能创建一个队列——它不能为将来创建的每种可能的类型创建一个队列,因为它们的数量是无限的!现在,如果您以某种方式唯一地命名这些类中的每一个,您就可以做到这一点,并且服务器中除了Message 接口之外没有任何东西关心Message 的细节,但是现在不需要模板接口就可以了?

标签: c++ templates inheritance interface polymorphism


【解决方案1】:

您不能将运行时多态性与模板直接混合。然而,另一层间接可能会有所帮助。这是一个人为的例子:

template <typename T>
inline void *New( void )
{
  return new T( );
}

只要存在默认构造函数,此函数将允许用户动态分配任何类型的对象。现在获取一个函数指针并将其分配给这个新函数:

void *(*NewFuncPtr)( void ) = New<int>;
int *i = (int *)NewFuncPtr( );

函数指针本身没有模板化,但可以指向模板化的函数。也许这也可以解决您的情况。

【讨论】:

  • 虽然我决定在不使用模板的情况下解决问题(并且使用“string getType()”方法),但这个解决方案确实很有帮助,所以我接受了。谢谢!
猜你喜欢
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多