Ich habe eine wirklich hässliche Implementierung von etwas, das ich umgestalten möchte, aber ich bin nicht sicher, wie. Hier ist, was ich habe:Wie man virtuelle Anrufe von nicht vorgestandenen Elternteilen sauber an Vorlagen schickt
Einige Templat-Objekt
template< typename T>
class Thing { };
Eine Schnittstelle
class IService {
public:
virtual void func(void* arg) = 0;
};
Ein Templat-Klasse Implementierung es
template< typename T>
class Service< T> : public IService {
virtual void func(void* arg) {
func((Thing< T>*)arg);
}
void func(Thing< T>* arg) {
// do something with arg
}
};
Der Grund ist, dass ich eine nicht wollen templated IService, den ich weitergeben kann. templating IService wird durch eine große Codebasis einen massiven Refactor verursachen.
Also instanziiere ich Service < T> Objekte, übergeben Sie die IService, und rufen Sie Func mit Vorlagen thing Objekte, die eine hässliche Umwandlung in eine ähnliche Funktion, die das eigentliche Thing-Objekt übernimmt. Gibt es einen sauberen Weg, dies zu erreichen, ohne IService zu templatieren?
Edit: etwas mehr Kontext. Dies ist, was ich wirklich will:
template<typename T>
class IService {
public:
virtual void func(Thing<T>* arg) = 0;
};
Allerdings kann ich nicht Vorlage IService.
Könnten Sie mehr Kontext dazu liefern, was Sie zu tun versuchen? –
Also muss jeder gegebene 'Service' das gleiche' T' wie das 'Ding' haben? Was ist, wenn ich 'Thing t anrufe; myIService-> func (t) 'wobei' meinIService' ein 'Service ' ist? –
David
@VittorioRomeo hinzugefügt – Erix