Seite 1 von 1

Template-Templates

Verfasst: Mi Aug 20, 2008 9:46 pm
von Xin
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.

Re: Template-Templates

Verfasst: Do Aug 21, 2008 11:45 am
von nufan
Normal beginnt ein Thread mit einer Frage und nicht gleich mit der Lösung :D

Re: Template-Templates

Verfasst: Do Aug 21, 2008 3:53 pm
von Dirty Oerti
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?

Re: Template-Templates

Verfasst: Do Aug 21, 2008 5:18 pm
von Xin
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.