Wie: Methoden eines Klassentemplates definieren und: Mehrteilige Klassentemplate-Hierarchie



  • Ableiten kannst du nur von vollständigen Typen. Ich nehme an, du willst was in der Art:

    template<template<typename> class T>, typename U>
    class Foo : T<U> {
      //...
    };
    


  • Hä? Ein bisschen genauer bitte! Wie würde das in meinem konkretem Fall aussehen?



  • Och menno, es kann doch nicht sein das ich seitenweise Quelltext schreibe und dann scheitert es an sowas! Ich poste jetzt einfach alles was mit Vererbung zutun hat und bin jedem auf ewig dankbar der mir sagt was falsch ist! 😞

    class AbstractOutMethod
    	{
                //...
                };
    
    class OutMethod_TextOut
    	{
                //...
                };
    template
    	<
    		class OutMethod=OutMethod_TextOut
    	>
    	class AbstractBuffering
    	:public OutMethod
                {
                //...
                };
    
    template
    	<
    		class OutMethod=OutMethod_TextOut
    	>
    	class Buffering_Lazy
    	:public AbstractBuffering
    	{
                //...
                };
    
    template
    	<
    		class Buffering=Buffering_Lazy,
    		class OutMethod=OutMethod_TextOut
    	>
    	class AbstractControls
    	:public Buffering <OutMethod>
                {
                //...
                };
    
    template
    	<
    		class Buffering=Buffering_Lazy,
    		class OutMethod=OutMethod_TextOut
    	>
    	class Controls_Default
    	:public AbstractControls<Buffering,OutMethod>
    	{
                //...
                };
    
    template
    	<
    		class Controls=Controls_Default,
    		class Buffering=Buffering_Lazy,
    		class OutMethod=OutMethod_TextOut
    	>
    	class AbstractEfficiency
    	:public Controls <Buffering,OutMethod>
    	{
                //...
                };
    
    template
    	<
    		class Controls=Controls_Default,
    		class Buffering=Buffering_Lazy,
    		class OutMethod=OutMethod_TextOut
    	>
    	class Efficiency_Safe
    	:public AbstractEfficiency<Controls,Buffering,OutMethod>
    	{
                //...
                };
    
    template
    	<
    		class Efficiency=Efficiency_Safe,
    		class Controls=Controls_Default,
    		class Buffering=Buffering_Lazy,
    		class OutMethod=OutMethod_TextOut
    	>
    	class Ostream
    	:protected Efficiency <Controls,Buffering,OutMethod>
                {
                    //...
                }
    

    Is nur copy'n'paste, hoffe hab alles erwischt...



  • Whoa. Da haste dir ja ein ganz schönes Monster zugelegt.

    Das sieht dann im Endeffekt so aus:

    class AbstractOutMethod {
      //...
    };
    
    class OutMethod_TextOut {
      //...
    };
    
    template <class OutMethod = OutMethod_TextOut>
    class AbstractBuffering : public OutMethod {
      //...
    };
    
    template <class OutMethod = OutMethod_TextOut>
    class Buffering_Lazy : public AbstractBuffering<OutMethod> {
      //...
    };
    
    template <template<class> class Buffering = Buffering_Lazy,
    	  class OutMethod = OutMethod_TextOut>
    class AbstractControls : public Buffering<OutMethod> {
      //...
    };
    
    template <template<class> class Buffering = Buffering_Lazy,
    	  class OutMethod = OutMethod_TextOut>
    class Controls_Default : public AbstractControls<Buffering, OutMethod> {
      //...
    };
    
    template <template<template<class> class, class> class Controls = Controls_Default,
    	  template<class> class Buffering = Buffering_Lazy,
    	  class OutMethod = OutMethod_TextOut>
    class AbstractEfficiency : public Controls<Buffering, OutMethod> {
      //...
    };
    
    template <template<template<class> class, class> class Controls = Controls_Default,
    	  template<class> class Buffering = Buffering_Lazy,
    	  class OutMethod = OutMethod_TextOut>
    class Efficiency_Safe : public AbstractEfficiency<Controls, Buffering, OutMethod> {
      //...
    };
    
    template <template<template<template<class> class, class> class, 
    		   template<class> class, class> class Efficiency = Efficiency_Safe,
    	  template<template<class> class, class> class Controls   = Controls_Default,
    	  template<class> class Buffering  = Buffering_Lazy,
    	  class OutMethod  = OutMethod_TextOut>
    class Ostream : protected Efficiency <Controls, Buffering, OutMethod> {
      //...
    };
    


  • //edit stimmt doch alles Oo



  • Übrigens mal designtechnisch - in dem Fall macht es vermutlich deutlich mehr Sinn, sowas zu machen:

    template<class _t_base = Efficiency_Safe<Controls_Default<Buffering_Lazy> > > Ostream : public t_base {
      //...
    };
    

    Das sieht dann nachher bei der Instanziierung nicht mehr ganz so schön aus, aber dafür lässt sich der Code wenigstens sinnvoll warten - durch den template<template<template<template<...-Kram blickt ja keiner mehr durch.



  • @Oxdeadbeef: Danke, du bist mein Retter! Würdest du mir bitte noch erklären wie genau man die template-template-template...-Parameter verwendet? (Link oder so reicht auch)



  • Ihr seid ja verrueckt :D.

    Musste mal gesagt werden :p

    mfg
    v R



  • virtuell Realisticer schrieb:

    Ihr seid ja verrueckt :D.

    Musste mal gesagt werden :p

    Na dann sei auch mal verrückt und erklär mir wie man template-template-Parameter benutzt... 😃



  • wenn du eine klasse willst, der du innerhalb des templates einen template parameter andrehen willst, dann geht das so:

    template<template<class> class T>
    class X{
        typedef T<int> irgendwas;
    };
    

    für ein template mit 2 template template parametern:

    template<template<class,class> class T>
    class X2{
        typedef T<int,float> irgendwas;
    };
    

Anmelden zum Antworten