Frage zu Templates



  • Hi,

    ich hab vor, ein Template für eine Matrix zu schreiben. Ich bin noch relativ unerfahren mit C++, habe aber jetzt wenig Lust erstmal stundenlang Bücher zu wälzen...

    Meine Frage:

    Kann ich irgendwie testen, welche Klasse der Benutzer meines Templates als template-Klasse angibt. Ich will halt zum Beispiel ausschliessen, dass jemand eine Matrix mit Elementen des Typs 'ScrollableWindow' oder son Mist erstellt.

    Gruss und Dank,

    new C_DoubleAdder();



  • Warum willst du das verhindern? Du gewinnst nichts dadurch, verhinderst höchstens, das irgendjemand seine genialen Gedanken, die du nicht vorhergesehen hast, verwirklichen kann.



  • Prinzipiell hast Du eigentlich recht.

    Nur dann muss ich testen können, ob die Klasse alle erforderliche Operatoren bereitstellt, oder kann ich dass mit ruhigem Gewissen Sache des Benutzers sein lassen?



  • Das brauchst du nicht testen, das tut schon der Compiler für dich.



  • ok, vermutlicfh habe ich den Compiler unterschätzt.
    Aber es wird einem viel eingererdet, von wegen pass auf jeden scheiss auf, das wonit du's gelernt hast ist das benuterfreundlichste was man gerade so kennt...(java)...



  • Das ist ja das Problem des Programmierers, was er mit dem Template anstellt und hat nichts mit Benutzerfreundlichkeit zu tun. Ein Programmierer sollte eigentlich wissen (wenn das Template einigermaßen gut dokumentiert ist), was man damit machen kann und was nicht. Das es z.B. keinen Sinn macht ein Bruchrechungs-Template mit Strings zu füttern dürfte klar sein.



  • Das ist ja eben auch ein "Vorteil" der Templates ... wenn dein Typ ne Funktion / Operator ned hat oder anders definiert, dann ist er nich "geeignet" fuer das Tamplate, und ned zur laufzeit, sondern schon beim compilieren wird gemeckert, vom kompiler ... und das bei Variablen datentypen ohne Vererbung !

    Wenn Scrollwindow oder so ned passt, hat der Anwender Pech ... und er muss nen Adapter schreiben. Aber dann sollt der Anwender genau wissen was er tut, und du solltest das ned verhindern !

    Ciao ...



  • none schrieb:

    Prinzipiell hast Du eigentlich recht.

    Nur dann muss ich testen können, ob die Klasse alle erforderliche Operatoren bereitstellt, oder kann ich dass mit ruhigem Gewissen Sache des Benutzers sein lassen?

    Du musst nich _alle_ Operatoren bereitstellen, die irgendjemand irgendwann einmal nutzen
    koennte, sondern du stellst die Operatoren bereit, die _du_ benoetigst und die sinnvoll
    fuer deine Klasse sind. Will jemand mehr, kann er von deiner Klasse erben und entsprechendes
    Implementieren. IMHO zumindest.

    mfg
    v R



  • @vR:

    Ich glaub Du bist leicht am Thema vorbei:
    none will keine Operationen bereitstellen, er will sie benutzen!

    template<typename T>
    class S
    {
    S()
    {
    T x = T();
    }
    }

    Funktioniert halt nur mit template-Argumenten, die einen Default-Konstruktor bieten. none wollte wissen, ob er irgendwie abfragen kann/muß, ob das eingesetzte Argument alle nötigen Operationen unterstützt. Zum Beispiel könnte eine bestimmte Membermethode erforderlich sein, oder ein bestimmter Konstruktor oder eben irgendwelche Operatoren.

    MfG Jester



  • Ah, so war das gemeint, jut sry, hab ich falsch verstanden.

    mfg
    v R



  • übrigens kann man (afaik) mit

    template class list<X>;
    

    testen ob für X operator< definiert is 😃 (X darf kein template-argument sein, glaub ich)
    will sagen:
    normalerweise werden bei instanziierten templates nur die enutzten methoden instanziiert, also ist matrix<string> eben doch schreibbar, solange der konstruktor kein < oder > benutzt. mit template bla; lässt sich bla explizit _komplett_ instanziieren und sich evtl. so die compilierzeit verkürzen (und ich weiß glaub sogar wie). siehe struppi. irgendwo am ende im kapitel über templates.



  • Mr. N: Schön und gut, aber die explizite Instantiierung macht ja der User, nicht der Autor des Templates ...



  • @Bashar: das ist klar. ich wollte dieses (denke ich) recht unbekannte sprachelement aber einfach mal vorstellen. (oder ist mir das verboten?)


Anmelden zum Antworten