如何从界面中删除不需要的功能

nak*_*iya 5 c++ coding-style

我有一个接口类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;
Run Code Online (Sandbox Code Playgroud)

现在,任何实现MyFunction只需要实现其中一个函数,具体取决于它需要返回什么类型的值.但即使其他两个函数是这样的,我也必须实现所有3个函数:

virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
Run Code Online (Sandbox Code Playgroud)

哪个看起来不那么好.或者,我可以在界面中声明这样的所有三个函数:

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;}
Run Code Online (Sandbox Code Playgroud)

这看起来也很难看.这两个中不那么丑陋的是什么?或者有更好的方法吗?

编辑:

关于D Krueger的方法:

#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);
}
Run Code Online (Sandbox Code Playgroud)

看起来专业化虽然派生,但不适用于各类.由于模板功能不能是虚拟的,这似乎是一种无望的情况.

MOn*_*DaR 2

当实现接口的类不需要其中的全部方法时,这表明您的接口设计可能需要重构。也许你可以把这个接口分成3个接口。

另一种可能性是从中创建一个包装器接口,它返回不需要的 2 个方法的默认值。但在这种情况下,您最终也会得到 3 个接口(原始父接口 -> 总共 4 个接口)。如果您无法更改原始界面,则此解决方案是可以接受的。