Kompilerfehler bei versuch eines ungültigen Aurufes, Klasse trotzdem kompilierbar



  • Hallo.

    Gleich eines vorweg:
    Ich weiß nicht ob es überhaupt möglich ist den Text zu kapieren *g*, vielleicht sagt der Code mehr aus.

    Ich will ein Wrapper Klassentemplate schreiben, dass T 'wrappt'.
    Allerdings sollen gewisste Operationen nur dann erlaubt sein, wenn das entsprechende T es auch unterstützt, man soll eine Instanz des Wrappers aber auch instanzieren können, falls die angegebene Klasse T die Operationen nur teilweise unterstütz. Versucht man dann unerlaubte Operationen auszuführen soll ein Kompilerfehler auftreten, versucht man es nicht, d.h. versucht man nur erlaubte Funktionen auszuführen soll alles gut gehn ohne Kompilerfehler.

    Eine Lösung die Laufzeitfehler verursacht hatte ich bereits gefunden, allerdings suche ich eine die den Fehler schon zur Kompilezeit findet.

    Ich kann es nicht gut in Worte fassen, schaut euch einfach den Code an und falls jemand versteht was ich meine wäre ich über eine Antwort dankbar 🙂

    // Klasse, die a und b enthält
    class AB
    {
    public:
    	void a();
    	void b();
    };
    
    // Klasse, die nur a enthält
    class A
    {
    public:
    	void a();
    };
    
    // Klasse, die nur B enthält
    class B
    {
    public:
    	void b();
    };
    
    // Klasse, die nichts von beiden enthält
    class E
    {
    };
    
    // Klassen-Template, die als eine art Wrapper-Klasse agiert
    // allerdings sind nur Operationen erlaubt, die auch der Typ T unterstütz,
    // falls unerlaubte Operationen aufgerufen werden (wie wb bei W<A>) dann soll ein Fehler zur Kompilerzeit auftreten
    // Ansonsten soll es kompilierbar sein.
    
    template<class T>
    class W
    {
    public:
    	T object;
    
    public:
    	// Wrapper Funktion für a
    	void wa()
    	{
    		// ???
    		object.a();
    	}
    
    	// Wrapper Funktion für b
    	void wb()
    	{
    		// ???
    		object.b();
    	}
    };
    
    // Main
    int main()
    {
    	W<AB> w1;
    
    	w1.wa(); //ok
    	w2.wb(); //ok
    
    	W<A> w2;
    
    	w2.wa(); //ok
    	w2.wb(); // hier möchte ich gerne einen kompiler-fehler, der user darf wb nicht aufrufen da A kein b enthält
    
    	W<B> w3;
    
    	w3.wa(); // hier möchte ich gerne einen kompiler-fehler, der user darf wa nicht aufrufen da B kein a enthält
    	w3.wb(); // ok
    
    	W<E> w2;
    
    	w4.wa(); // hier möchte ich gerne einen kompiler-fehler, der user darf wa nicht aufrufen da E kein a enthält
    	w4.wb(); // hier möchte ich gerne einen kompiler-fehler, der user darf wb nicht aufrufen da E kein b enthält
    
    	return 0;
    }
    


  • Hm, halte mich bitte nicht für spiessig, aber der Code tut beim compilieren doch genau das was du verlangst 😕



  • ^^ gerade eben getestet, du hast recht.

    das problem war, dass ich dabei war eine klasse für properties zu schreiben und um die sache ins forum zu stellen, wollte ich ein einfacheres beispiel machen.
    bin davon ausgegangen dass das einfache beispiel die selben probleme ausweißt wie meines.

    ^^ allerdings hatte ich einen sehr dummen fehler gemacht, ich hatte nämlich nicht a und b, sondern get und set, und nicht wa und wb, sondern operator= und operator T. Im Operator= hab ich ausversehen beide, sowohl get als auch set benutzt und somit einen Fehler bekommen _''. Wie ich das übersehn konnte: kp

    Danke für deine Hilfe, trotzdem 🙂


Anmelden zum Antworten