Können funktionen schon beim kompilieren ausgeführt werden?



  • Hallo liebe Experten des Template Meta Programmierung,
    wer von euch hat schonmal ein Meta IF für den Windows C++ Compiler (VC++7) geschrieben?
    Der Compiler von Windows ist nicht wirklich standartkonform.
    Beispielsweise scheint partielle Spezialisierung nur bedingt möglich.



  • titus78 schrieb:

    Hallo liebe Experten des Template Meta Programmierung,
    wer von euch hat schonmal ein Meta IF für den Windows C++ Compiler (VC++7) geschrieben?

    eine standardkonforme variante oder eine non-konforme?

    hier die standard konforme:

    namespace hidden
    {
    template<bool condition>
    struct IfThenElseImpl
    {
      template<class Then, class Else>
      struct inner
      {
        typedef Then result;
      };
    };
    
    template<>
    struct IfThenElseImpl<false>
    {
      template<class Then, class Else>
      struct inner
      {
        typedef Else result;
      };
    };
    }
    
    template<bool condition, class Then, class Else>
    struct IfThenElse
    {
      typedef hidden::IfThenElseImpl<condition>::inner<Then, Else>::result result;
    };
    


  • Ok, danke für die Antworten:
    Ich werd mich bei Gelegenheit mal damit beschäftigen, aber ich denke für meine Zwecke ist es wirklich einfacher per Hand zu rechnen.



  • Shade Of Mine schrieb:

    titus78 schrieb:

    Hallo liebe Experten des Template Meta Programmierung,
    wer von euch hat schonmal ein Meta IF für den Windows C++ Compiler (VC++7) geschrieben?

    eine standardkonforme variante oder eine non-konforme?

    hier die standard konforme:

    [...]
    template<bool condition, class Then, class Else>
    struct IfThenElse
    {
      typedef hidden::IfThenElseImpl<condition>::inner<Then, Else>::result result;
    };
    

    Nicht ganz konform. Fehlt ein typename und ein template. So ist's richtig:

    template<bool condition, class Then, class Else>
    struct IfThenElse
    {
      typedef typename hidden::IfThenElseImpl<condition>::template inner<Then, Else>::result result;
    };
    


  • stimmt. sorry.
    hab das aus dem gedächtnis geschrieben 😞



  • Nicht ganz konform. Fehlt ein typename und ein template. So ist's richtig:

    das typename verstehe ich und ist auch logisch, aber wann muss man templates explizit qualifizieren? Wozu? Und welcher Compiler verlangt das? (Meine üblichen Compiler übersetzen sowohl mit, als auch ohne anstandslos).



  • Helium schrieb:

    Nicht ganz konform. Fehlt ein typename und ein template. So ist's richtig:

    das typename verstehe ich und ist auch logisch, aber wann muss man templates explizit qualifizieren?

    Ähnlich wie bei typename. Wann immer du in einem Template (Funktion oder Klasse) ein Membertemplate eines von einem Templateparameter (des Templates) abhängigen Typs ansprechen willst.

    Wozu?

    Um dem Compiler mitzuteilen, dass es sich bei dem nachfolgenden Namen um ein Template handelt. Ansonsten gilt: Ein abhängiger Name ist niemals ein Template, es sei denn er wird explizit als solcher gekennzeichnet.
    Genauso wie für typename gilt: "Ein abhängiger Name ist niemals ein Typ, es sei denn er wird explizit also solcher gekennzeichnet".

    Klassisches Beispiel:

    extern int a;
    template <class AType>
    void Func(AType obj)
    {
        obj.anotherFunc<3>(a);
    }
    

    Da der Compiler in der ersten Phase nichts über AType weiß, nimmt er an, dass anotherFunc ein Member von AType ist. Die Zeile ist so also nicht weiter als ein Vergleich. Kein Funktionsfaufruf.

    extern int a;
    template <class AType>
    void Func(AType obj)
    {
        obj.template anotherFunc<3>(a);
    }
    

    Jetzt hingegen weiß der Compiler, dass antoherFunc ein Membertemplate ist. Jetzt hast du also einen Funktionsaufruf der Funktion anotherFunc, die offensichtlich einen non-Type-Template-Parameter sowie ein Argument erwartet.

    Und welcher Compiler verlangt das?

    Jeder standardkonforme 🙂
    Der Comeau z.B. Und soweit ich weiß auch die neueren gccs.



  • Habe mich von "Shade Of Mine" inspirieren lassen...

    #ifndef DEF_WINTMPLT_H
    #define DEF_WINTMPLT_H
    
    // titus78[at]gmx.net
    
    namespace Meta {
    	template <bool B, typename T1, typename T2> struct If {
    		template <bool _B>	struct _If; 
    		template <>			struct _If <true>	{ typedef T1 return_type; }; 
    		template <>			struct _If <false>	{ typedef T2 return_type; }; 
    		typedef typename _If<B>::return_type return_type;
    
    	};
    }
    
    #endif
    


  • @titus:
    wenn ich nicht irre, ist das nicht standardkonform.
    da spezialisierungen innerhalb von klassen AFAIK verboten sind.

    der vc++ schluckt es trotzdem - damit lässt sich des öfteren partielle spezialisierung simulieren. aber konform ist es halt nicht.

    nimm doch meine version - die läuft sogar auf anderen compilern 🙂



  • @Hume: O, leuchtet ein, danke.

    Der Comeau z.B. Und soweit ich weiß auch die neueren gccs.

    Auch die neueren gccs nicht.


Anmelden zum Antworten