Interface for template methods
我有一个类Foo,它提供某种功能。为了保持模块化,EDCOX1×0是一个接口(即,只有抽象方法的C++类),并且FoO的实现可以选择如何精确地实现功能。但是,我的界面包含一个模板方法。也就是说,
1 2 3 4 5 6
| class Foo
{
public:
template<class T>
void functionality(const T&);
}; |
在C++中,模板方法virtual是不可能的。是否有任何技术可以用模板方法实现类似的结果(模块化和多态性)?
- 您是否有一组有限的、预先确定的类型需要使用它?您是否可以提供T的任何属性,如"must be a integer like type"或"must be a functor like type"或"must be a number like type"?您是否需要通过特性类或类似支持进行"第三方"扩展?究竟,functionality做了什么?在这种情况下,性能到底有多重要?(而不仅仅是"我喜欢快速的事物":即"在60赫兹的7 mpx图像上,这个功能必须每像素运行一次")。算法是否基本上忽略了作为载体的T的值?
- stackoverflow.com/questions/7968023/c-virtual-template-metho&zwnj;&8203;d
- stackoverflow.com/questions/2354210/&hellip;
- foo实现来自n个不同进程的send和recv消息。我的初始实现是为每种消息类型使用一个消息队列,T是可以作为消息发送的类(所有这些类都扩展了一个抽象类Message)。这样的send和recv方法之所以是模板,是为了在编译时通过一些消息类型的运行时注册自动设置队列管理。我的愿望是,如果将来出于某种原因,人们希望通过互联网而不是IPC进行通信。
- 有一些有限的技术。您可以拥有一组固定的派生类和一组无限的潜在模板实例化,或者您可以拥有一组无限的潜在派生类和一组固定的模板实例化,但不能同时拥有两组无限。挑一个。
- 假设一个客户发明了一种新的类型Bob,它源自Message。服务器在几年前就已经编译好了,它不知道Bob。所以它不能创建一个队列——它不能为将来可能创建的每种类型创建一个队列,因为它们的数量是无限的!现在,如果您以某种方式唯一地命名这些类中的每一个,并且服务器中除了Message接口外,没有任何其他关心Message接口的细节,那么您可以这样做,但是现在不需要模板接口了,是吗?
- @当然,yakk,但是在这种情况下,必须以这样一种方式创建消息类,消息的这种唯一性将出现在Message接口中。在我的例子中,这很奇怪,因为消息的定义是由执行协议的各方声明的,而不是在发送消息(服务器)时进行的网络连接。然而,我通过放弃模板支持来解决我的问题,并使用rtti来增加通信和消息分离的模块性。谢谢大家!;)
不能将运行时多态性直接与模板化混合。然而,另一层间接性可能会有所帮助。这里有一个人为的例子:
1 2 3 4 5
| template <typename T>
inline void *New( void )
{
return new T( );
} |
只要存在默认构造函数,此函数将允许用户动态分配任何类型的对象。现在获取一个函数指针并将其分配给这个新函数:
1 2
| void *(*NewFuncPtr)( void ) = New<int>;
int *i = (int *)NewFuncPtr( ); |
函数指针本身不是模板化的,但可以指向模板化的函数。也许这也能解决你的问题。
- 尽管我决定不使用模板(并且使用"string gettype()"方法)来解决这个问题,但这个解决方案确实很有帮助,所以我接受它。谢谢!