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;
}




