Template-Templates

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Template-Templates

Beitrag von Xin » Mi Aug 20, 2008 9:46 pm

Hallo,

ich musste mich grade mal wieder in Template-Templates arrangieren und feststellen, dass ich ziemlich aus der Übung diesbezüglich bin.
Am Schluss habe ich es dann doch noch lauffähig bekommen.

Wenn also jemand mal Probleme mit Template-Templates hat (oder ich wieder ein Beispiel suche), so findet sich hier nun ein Beispiel:

Code: Alles auswählen

#include "stdio.h"

template< typename base >
class Handler_A
{
  public:
    base          Value;

  Handler_A( base value ) : Value( value ) {}
};

template< typename base >
class Handler_B
{
  public:
    base          Value;

  Handler_B( base value ) : Value( 2*value ) {}
};

template< typename base
        , template< typename base > class handler >
class Container
{
  private:
    handler<base> Handler;

  public:
     Container( base value ) : Handler( value )
     {
     }

     base GetValue()
     {
       return Handler.Value;
     }
};

template <           typename base
         , template< typename base > class handlerA
         , template< typename base > class handlerB >
int add( Container< base, handlerA > &a, Container< base, handlerB > &b )
{
  return a.GetValue() + b.GetValue();
}


template < template < typename base > class handler_r
         , typename base
         , template < typename base > class handler_a
         , template < typename base > class handler_b >
Container< base, handler_r > func( Container< base, handler_a > &a, Container< base, handler_b > &b )
{
  return Container< base, handler_r >( a.GetValue() + b.GetValue() );
}

int main( void )
{
  Container< int, Handler_A > a( 1 );
  Container< int, Handler_B > b( 1 );

  printf( "a (1): %d, b (2): %d\n", a.GetValue(), b.GetValue() );
  printf( "add (3): %d\n", add( a, b ) );

  printf( "funcA (3): %d\n", func< Handler_A, int, Handler_A, Handler_B >( a, b ).GetValue() );
  printf( "funcA (3): %d\n", func< Handler_A >( a, b ).GetValue() );

  printf( "funcB (6): %d\n", func< Handler_B, int, Handler_A, Handler_B >( a, b ).GetValue() );
  printf( "funcB (6): %d\n", func< Handler_B >( a, b ).GetValue() );

  return 0;
}
In den Klammern die erwarteten Werte.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Template-Templates

Beitrag von nufan » Do Aug 21, 2008 11:45 am

Normal beginnt ein Thread mit einer Frage und nicht gleich mit der Lösung :D

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Template-Templates

Beitrag von Dirty Oerti » Do Aug 21, 2008 3:53 pm

dani93 hat geschrieben:Normal beginnt ein Thread mit einer Frage und nicht gleich mit der Lösung :D
Nicht immer^^
(siehe Projekte)
Xin hat geschrieben:Template-Templates
Wozu verwendest du so etwas?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Template-Templates

Beitrag von Xin » Do Aug 21, 2008 5:18 pm

Dirty Oerti hat geschrieben:
Xin hat geschrieben:Template-Templates
Wozu verwendest du so etwas?
Templates verwendet man (vorrangig), um typsichere Container zu schaffen, wie typisierte Listen. Also Listen, die sich um einen Typ T kümmern.
Template-Templates verwendet man, wenn man einen Container braucht, der in abhängigkeit von einem Typ T, eine Aufgabe entsprechend eines Algorithmus handhabt. Den Algorithmus stellt man in einem weiteren Datentyp A da, der häufig Abhängigkeit des Basistyps steht: A<T>. Der Container<T> ist also auch abhängig vom Algorithmus A<T>, also ein Template, dass von einem Template abhängig ist.

Das Template erzeugt eine Klasse, die für T verantwortlich ist und ihre Aufgaben mit Hilfe des Algorithmus A<T> erledigt.
Was ich hier ausprobiere ist, wie ich zwei gleiche Container-Klassen, die T verarbeiten, in eine Funktionen übergebe, wenn sie mit unterschiedlichen Algorithmen arbeiten, um ihre Daten irgendwie zu verarbeiten.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten