Mam interfejs klasy MyFunction
. Istnieją trzy funkcje w tej klasie z następujących podpisów:Jak usunąć niechciane funkcje z interfejsu
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;
Teraz, każde wdrożenie MyFunction
będą potrzebne tylko w celu realizacji jednego z tych funkcji, w zależności od typu wartości musi powrócić. Ale będę musiał wdrożyć wszystkie 3 funkcje, nawet jeśli pozostałe dwie funkcje są takie:
virtual bool Eval(double& dReturnVal, size_t szArgumentCount, list<Param> lParameterList){return false;}
co nie wygląda tak dobrze. Lub, mogę zadeklarować wszystkie trzy takie funkcje w interfejsie:
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;}
Co również wygląda brzydko. Co jest mniej brzydkiego z tych dwóch? Czy istnieje lepszy sposób to zrobić?
EDIT:
Na Metoda D Kruegera:
#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);
}
Wygląda specjalizacji nie ma zastosowania w poprzek klas choć pochodzą. Ponieważ funkcje szablonu nie mogą być wirtualne, wydaje się, że jest to sytuacja beznadziejna.
Może to, czego szukasz, to coś w rodzaju 'boost :: variant' dla parametru pojedynczej funkcji. –
GManNickG
Proszę nie dopuścić. :). Nie można go użyć.Chcę czegoś, co mogę zbudować na własną rękę. – nakiya
Jeśli twój interfejs ma inne czyste funkcje wirtualne, idź z drugim. Nie uzyskasz więcej "czystości" od bardziej czystych funkcji wirtualnych, a uzyskasz pożądany efekt. Jeśli chcesz, możesz wymyślić jakąś sztuczkę, aby upewnić się, że co najmniej jedna z funkcji 'Eval()' może zwrócić true, ale może to być czarna magia. –