Policy Design Pattern mit "Querverbindungen"



  • Hi zusammen,

    beispielhaft folgender Code:

    class inputPolicyThatUsesBoost
    {
    public:
      boost::something data() { return wasauchimmer; }
    };
    
    class inputPolicyOther
    {
    public:
      std::map<> data() { return wasauchimmer; }
    };
    
    class workPolicyEins
    {
    public:
      void do_something(/* mist */){};
    };
    
    tempate<typename InputPolicy, typename WorkPolicy>
    class output {  
      InputPolicy m_input;
      WorkPolicy m_work;
    public:
      void output()
      {
        m_work.do_something(m_input.data());
      }
    };
    

    Die InputPolicy hat bei einer Methode evtl. unterschiedliche Rückgabetypen, je nachdem welche Policy ich einsetze, z.B. falls ich mit boost arbeiten kann/darf, oder eben nicht.

    Die WorkPolicy nutzt jetzt aber diese Methode data() aus der InputPolicy aufrufen..

    Das Problem ist letztendlich dass die beiden Policies sich nicht kennen, aber miteinander arbeiten müssen.

    Gibts hierfür auch irgendein pattern oder eine "elegante" Lösung?

    Vielen Dank für eure Hilfe



  • Verstehe ich richtig, dass du den Argumenttyp von workPoliciyEins nicht festlegen kannst, weil die Klasse dafür Infos über inputPolicy brauchen würde?
    Dann mache das Argument von do_something() doch einfach zum Template.



  • Offensichtlich ist workPolicy von der inputPolicy abhängig. Was spricht also dagegen, wenn die workPolicy als Template-Parameter die inputPolicy erhält?

    template<class InputPolicy>
    class WorkPolicy
    {
    // ctor muss das InputPolicy-Objekt erhalten oder Du übergibst es nur für den Methodenaufruf
    };
    
    template<class InputPolicy, /* entsprechend für die WorkPolicy */>
    class output
    {
    // ...
    };
    

    Template-Template-Parameter sind tricky, weil typename da nicht immer class entspricht (aber die Regeln kenne ich nicht, geht ja erstmal nur um die Idee).



  • template <class foo, template <class bar> class foobar>
    

    oder mit typename:

    template <typename foo, template <typename bar> class foobar>
    

    Typenames können keine Templateparameter haben.


Log in to reply