Metaprogrammierung Limits



  • Hi, lese gerade einige Sachen über Metaprogrammierung und finde immer die Warnung, dass mans mit Rekursionen nicht übertreiben soll und der Compiler relativ schnell an seine Grenzen stösst.
    Könnte mir jemand erklären, wovon diese Begrenzung/maximale Tiefe abhängt?
    Ist diese Grenze eventuell anpassbar? (Habe in VS08 bislang noch nix gefunden)

    Eine "maximale Tiefe" ist wohl auf nur einen(1) rekursiven Lauf bezogen, bei mir macht der Compiler bei Tiefe 500 schlapp.

    Ich teste das ganze hiermit:

    // -----------------IF THEN ELSE-------------------------
    template< bool condition, typename Then, typename Else >
    struct IF
    {
    	typedef Then RET;
    };
    
    template< typename Then, typename Else >
    struct IF<false, Then,Else >
    {
    	typedef Else RET;
    };
    // ------------------------------------------------------
    
    template< int N >
    struct Value
    {
    	enum { result = N };
    };
    
    template< int N, int U = IF< !(N%2), Value<0>, Value<N> >::RET::result  >
    struct OnlyPositive
    {
    
    	typedef typename IF< !(N%2), OnlyPositive<N-1,N-1>, OnlyPositive<N-1,0> >::RET SubRET;
    	enum { result = N - U + SubRET::result };
    };
    
    template<>
    struct OnlyPositive<0,0>
    {
    	enum { result = 0 };
    };
    
    int main()
    {
      // std::cout << OnlyPositive< 499 >::result; // Compiler fehler
         std::cout << OnlyPositive< 495 >::result; // OK
    }
    


  • Abhängig ist die tiefe lediglich von der Grösse des Stacks. Sprich es gibt einen Stakcoverflow, wenn du es übertreibst.



  • Naja, die Tiefe ist auch abhängig von der Kompilierzeit 😉 evilissimo hat hier mal ein Beispiel gebracht, das man auf einem sehr starken Rechner nicht in einigen Tagen kompilieren konnte.

    [Edit] Hier ists: http://www.c-plusplus.net/forum/viewtopic-var-t-is-136704-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html


Anmelden zum Antworten