У меня есть класс интерфейса 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:
О методе 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
нет повышение пожалуйста. :). Невозможно использовать.Я хочу что-то, что могу построить самостоятельно. – nakiya
Если ваш интерфейс имеет другие чистые виртуальные функции, перейдите со вторым. Вы не получите больше «чистоты» от более чистых виртуальных функций, и вы получите эффект, который вы желаете. Если вы хотите, чтобы вы могли обработать какой-то трюк, чтобы убедиться, что хотя бы одна из функций 'Eval()' может возвращать true, но это может быть черная магия. –