У меня есть интерфейс класса 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;}
Что тоже выглядит некрасиво. Что менее уродливо из этих двух? Или есть лучший способ сделать это?
EDIT:
По методу Д. Крюгера:
#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);
}
Похоже, специализация не распространяется на классы, хотя и производные. Поскольку функции шаблонов не могут быть виртуальными, похоже, это безнадежная ситуация.