【发布时间】:2016-02-08 02:30:27
【问题描述】:
我正在尝试创建一个非模板基类来创建一个接口,通过该接口我可以与派生的模板类进行交互。我希望使用部分虚函数重载,但有些东西不起作用,我不知道为什么。 谁能解释为什么我下面的代码返回:
B match = False
D match = True
E match = False
而不是 B、D 返回 True 和 E 返回 False?我原以为派生类中的重载运算符会获取指向 int '&i' 的指针并被调用,但事实并非如此。
需要明确的是,我不是要 - 覆盖 - 匹配的基本版本,我是要 - 重载 - 它,特别是希望它有一个不同的,在这种情况下更专业的接口,而不是Base,在使用其函数签名时接管。
我还试图避免必须为我可能实例化的派生模板的每种风格扩展基类。
更陌生,我 - 可能 - 只是在这里发疯,但我发誓这在不久前的某个时候对我有用! Fwiw 我在 OSX 10.5 上,使用 llvm 7.0.0 和 clang 700.1.76。这可能是编译器的特性吗?
虽然我在这里尝试(未成功)使用部分重载,但我真的很愿意接受任何方法来解决通过其参数类型选择模板实例函数的问题,而不增加类,if-thens/case或向基类添加特定的专业化。如果您有其他类似功能的方法,我很乐意听到。
感谢您提供的任何见解!
#include <stdio.h>
class Base
{
public:
Base() {}
virtual ~Base(){}
virtual bool match( const void *data ) const { return false; }
};
template <class Type>
class Derived: public Base
{
public:
Derived():Base() {}
~Derived() override{}
virtual bool match( const Type *data ) const { return true; }
};
int main(int argc, char **argv)
{
Derived<int> *d = new Derived<int>();
Derived<float> *e = new Derived<float>();
Base *b = d;
int i;
printf("B match = %s\n",b->match(&i)?"True":"False");
printf("D match = %s\n",d->match(&i)?"True":"False");
printf("E match = %s\n",e->match(&i)?"True":"False");
}
【问题讨论】:
-
πάντα ῥεῖ,好点子!我忘了我可以编辑问题! :) 已修复。
-
你的虚函数不纯。看看这是否给你一个合理的解决方案:stackoverflow.com/questions/2919584/…
-
@o_weisman,感谢您的评论。使我的 Base 函数成为纯虚拟函数似乎并不能解决这个设计问题。您提到的问题是值得深思的问题,但如果不为我可能使用的每个派生类型增加特定的子类,我无法弄清楚如何应用它。换句话说,如果模板定义中没有内置的实例选择机制,则必须编写和实例化许多特定的类。不过还是谢谢你,感谢你的帮助。
-
做一些搜索我想你想要的是函数模板,这是一个例子stackoverflow.com/a/972170/2899478
-
@o_weisman 谢谢!我能够使用功能模板想出一个解决方案......我发布了一个基于它们的正确功能的答案。感谢您引导我朝着更有成效的方向前进!
标签: c++ templates overloading