【发布时间】:2014-03-02 19:45:24
【问题描述】:
我尝试实现此类的以下行为/语法/用法:
Data1 dataType1;
Data2 dataType2;
int intType;
float floatType;
dataType1.method( intType );
dataType1.method( floatType );
dataType2.method( intType );
dataType2.method( floatType );
我的做法是这样的:
struct CDataBase
{
template< typename T > virtual void method( T type ) = 0;
};
struct CData1 : CDataBase
{
template< typename T > void method( T type ) {}
};
struct CData2 : CDataBase
{
template< typename T > void method( T type ) {}
};
但是虚拟模板方法是不可能的。也不需要实际的基类,但是我必须确保某些类实现了(模板)“方法()”。
如何强制非模板化的类/结构覆盖模板方法?
编辑: 这是我的实际布局:
struct Data0
{
int someVar;
template< class T >
void decode( T& type )
{
type.set( someVar );
}
};
编辑: 在当前版本的 C++ (11) 中,我尝试实现的行为是不可能的。除此之外,我真的应该重新编码这部分以避免这个问题。但是我接受给出的唯一答案,谢谢你的付出。
【问题讨论】:
-
如何强制非模板类/结构覆盖模板方法?您可能想使用static type check。
-
首先,:%s/how/why/g 你想解决什么问题?虚拟和模板 成员 不能混合(您已经发现)。我同意@πάνταῥεῖ。也许特征模型更适合您的最终目标。
-
@WhozCraig 我仍在寻找一篇论文的(过时的)链接,该链接显示了一种简洁的方式,即如何为 c++11 之前的标准设置概念检查。我基于此建立了一个小概念检查框架,可能我应该将其发布为 github gist 或项目。我目前不太熟悉 c++11 标准 type support library 朝这个方向发展的可能性。
-
如果可以的话,我会将它标记为与我刚刚在相关菜单上找到的这个重复:how-to-design-around-the-limitation-that-templated-member-functions-cant-be-vir。 Double Dispatch 或全局函数是解决此问题的方法,但我并没有对我真正想要的(简单)用法失去希望。
-
@Serthy 是的,这也可以回答你的问题,只要你坚持需要纯虚函数。
标签: c++ templates overriding virtual