我有一个接口类MyFunction
。有三种功能于此类具有以下特征:如何从接口中删除不需要的功能
virtual bool Eval(int& iReturnVal, size_t szArgumentCount, list<Param> lParameterList) = 0;
virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList) = 0;
virtual bool Eval(char*& zReturnVal, size_t szArgumentCount, list<Param> lParameterList) = 0;
现在,MyFunction
任何的实现只需要实现取决于它需要返回值的类型,这些功能之一。但是,即使其他两个功能是这样,我也必须实现所有3个功能:
virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
这看起来不太好。或者,我可以在界面中声明所有这三个功能:
virtual bool Eval(int& iReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
virtual bool Eval(char*& zReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
这看起来也很丑陋。这两个比较丑陋的是什么?还是有更好的方法来做到这一点?
编辑:
在d克鲁格的方法:
#include <iostream>
using namespace std;
class Base
{
public:
template<typename T>
void F(T){cout << "Type T" << endl;}
};
class Imp : public Base
{
public:
template<int>
void F(int){cout << "Type int" << endl;}
};
int main(int argc, char** argv)
{
Base* pB;
Imp oI;
pB = &oI;
pB->F(1);
}
看起来专业化不能跨类申请,虽然的。由于模板功能不可能是虚拟的,这看起来是无望的。
也许你正在寻找类似于'boost :: variant'的参数的单个函数。请致电 –
GManNickG
2010-10-21 04:51:56
。 :)。无法使用它。我想要我可以自己建立的东西。 – nakiya 2010-10-21 04:54:29
如果您的界面具有其他纯虚拟功能,请使用第二个。你不会因为拥有更纯粹的虚拟功能而获得更多“纯洁”,而会得到你想要的效果。如果你想要的话,你可能可以通过一些技巧来确保至少有一个Eval()函数可以返回true,但这可能是黑魔法。 – 2010-10-21 04:55:43