Sind "Interfaces" in C++ notwendig?



  • Das kannst du so garnicht prüfen. Wenn sowohl a_1 als auch b_2 als Templateparameter in Frage kommen, dürfen diese zusammen verwendet werden. Es gibt in C++ keine constraints für Templateparamter. Du könntest den Test aber z.B. so machen:

    template<int i>
    struct IntToType
    {
    	enum { value = i };
    };
    
    template
    <
        template<typename> class A,
        template<typename> class B
    >
    class Foo
    {
        typedef A<int> a_type;
        typedef B<int> b_type;
    
        int types_cannot_be_used_together[a_type::test::value == b_type::test::value ? 0 : -1];
    };
    
    template<typename T>
    class A
    {
    public:
        typedef IntToType<1> test;
    };
    
    template<typename T>
    class B
    {
    public:
        typedef IntToType<1> test;
    };
    
    template<typename T>
    class C
    {
    public:
        typedef IntToType<3> test;
    };
    
    int main()
    {
    	Foo<A, B> x;
    	Foo<B, C> y; // geht nicht
    	Foo<A, C> z; // geht nicht
    }
    

    Dann werden nur Typen mit gleichen Testwerten angenommen. Allerdings ist das natürlich arg eingeschränkt. 😉



  • MrMilk schrieb:

    Ah, dass ist aber einfach.

    Das vergleicht man gerne mit "Duck Typing". Wenn es watschelt wie eine Ente, schwimmt wie eine Ente, schnattert wie eine Ente, dann ist es eine Ente. Da bei C++ das mit den Template-Parametern alles zur Compile-Zeit erledigt wird, kannst Du dann einfach Dein Programm nicht kompilieren, wenn "da irgendwas nicht passt".

    Es ist aber natürlich, dass Du Bedingungen an Typparametern beschreiben willst. Das macht man üblicherweise in der Dokumentation, weil die Sprache selbst so etwas (noch) nicht ausdrücken kann.

    MrMilk schrieb:

    Angenommen nun gibt es folgende Situation.

    template
    <
        template<typename> class A,
        template<typename> class B
    
    >
    class C
    {
        //...
    }
    

    Wie kann ich überprüfen, ob A und B harmonieren?

    Beispiel es gibt: a_1, a_2 und a_3 sowie b_1, b_2 und b_3.
    [sind alles Klassen]

    Und a_1 und b_2 ergeben semantisch keinen Sinn. Kann ich dieses per Compiler ausgeben?

    Wenn sie nicht "harmonieren" stoppt Dein Compiler und weist Dich darauf hin. Leider sind das oft kryptische Fehlermeldungen, die sich über mehrere Seiten erstrecken. Das kann man aber mit ein paar Tricks reduzieren in manchen Fällen.

    Gruß,
    SP



  • uhhh boost oder ähnliches darf ich nicht nehmen. Gibt es vielleicht etwas was im aktuellem Standard ist oder man mit static_assert(*) lösen könnte? Insgesamt darf ich nur auf den Standard zurück greifen.

    Viele Grüße
    MM

    (*) Im Forum wurde gezeigt wie man dieses nach programmieren kann.


  • Mod

    boost ist Standard. Zumindest könntest du dir die Dokumentation dazu anschauen.



  • camper schrieb:

    boost ist Standard.

    Echt? Nee, gell.


  • Mod

    volkard schrieb:

    camper schrieb:

    boost ist Standard.

    Echt? Nee, gell.

    Ja, doch. Gell. MrMilks Antwort scheint zu implizieren, dass boosts Bibliotheken mit irgendwelcher nicht-standardkonformer Magie arbeiten (was im Wesentlichen nicht zutrifft), oder das es ok ist, wenn jemand hier die Information, die unmittelbar durch den gegebenen Link verfügbar gemacht wurde, einfach nochmal produziert.



  • camper schrieb:

    volkard schrieb:

    camper schrieb:

    boost ist Standard.

    Echt? Nee, gell.

    Ja, doch. Gell. MrMilks Antwort scheint zu implizieren, dass boosts Bibliotheken mit irgendwelcher nicht-standardkonformer Magie arbeiten (was im Wesentlichen nicht zutrifft),

    Nö. Er sagt nur, daß er kein boost nehmen darf, weils nicht Teil von Standard-C++ ist.

    camper schrieb:

    oder das es ok ist, wenn jemand hier die Information, die unmittelbar durch den gegebenen Link verfügbar gemacht wurde, einfach nochmal produziert.

    Schätze nicht, daß es jemand nötig hat, darauf einzugehen. Die Lösungen sind gezeigt und ausarbeiten darf er es selber. Es ist aber auch kein Problem, wenn es jemand für ihn macht.

    Aber deswegen so zu tun, als sei boost teil des Standards, das will mir nicht in den Kopf hinein. Gefahrenabwehr durch Verwirrungstaktik?


  • Mod

    volkard schrieb:

    Aber deswegen so zu tun, als sei boost teil des Standards, das will mir nicht in den Kopf hinein.

    Diese Interpretation wäre noch verständlich, wenn sie von jemand anderes stammte. Vermutlich hätte ich ein kleines s beim standard nehmen sollen. Jedenfalls habe ich weder Teil noch des Standards geschrieben.

    volkard schrieb:

    Gefahrenabwehr durch Verwirrungstaktik?

    durch wen?



  • Naja, dann hast Du mit

    MrMilk: uhhh boost oder ähnliches darf ich nicht nehmen. Gibt es vielleicht etwas was im aktuellem Standard ist
    camper: boost ist Standard.

    es aber erzwungen, daß man Dich mißversteht.



  • Ich hätte "Boost ist Standard" auch anders verstanden. Boost ist kein Standard, höchstens Quasi-Standard. Es ist aber (hoffentlich) standardkonform. 😉

    Gruß,
    SP



  • Ich denke mal camper meinte es eher so, dass MrMilk wie beim static_assert auch sich theoretisch einfach die Boost-Sachen abtippen könnte ohne dafür irgendwelche nicht-Standard Erweiterungen installieren zu müssen. Frei nach dem Motto, wenn ein #include "MrMilksAbgetipptesBoost/type_traits.hpp" okay ist, sollte auch ein #include "boost/type_traits.hpp" okay sein, zumal der Inhalt identisch ist und es keine rechtlichen Unterschiede gibt.



  • Hallo,

    leider bin ich erst jetzt dazu gekommen auf diesen Beitrag zu antworten.
    Darf ich so etwas einfach abtippen bzw. wo würde ich es finden? Leider bin ich mir nicht im klaren was erlaubt ist und was nicht.

    Viele Grüße
    MM



  • MrMilk schrieb:

    Leider bin ich mir nicht im klaren was erlaubt ist und was nicht.

    Das kommt immer auf die Lizenzen an.

    wo würde ich es finden?

    http://lmgtfy.com/?q=boost


Anmelden zum Antworten