2014-01-06 96 views
4

我對此很陌生。我創建與策略類說:帶參數的C++模板策略

template <typename T, 
      typename P1 = Policy1<T>, 
      typename P2 = Policy2<T> > 

{ 
    ... 
} 

我有是一些政策有參數,當他們編譯時它是確定

template <typename T, 
      typename P1 = Policy1<T, size_t N>, 
      typename P2 = Policy2<T> > 

但問題的時候都運行我不確定提供策略類對象的最佳方式是什麼......或者這不再是策略模式?

+1

給我們的,你想如何在運行時做到這一點的例子。 – 0x499602D2

+0

標準庫通過在構造函數中接受初始值設定項來解決此問題。例如。用於自定義比較器或分配器。 – sehe

+0

說政策類有一個構造函數接受參數,你傳遞一個對象到你的類 – gsf

回答

9

您可以爲看到添加以下

Ooor爲標準庫做你能做的政策:) 編輯工廠:

#include <string> 

struct DummyPolicy { }; 

template <typename> 
struct Policy1 { Policy1(int, std::string) { } }; 

template <typename T, 
      typename P1 = Policy1<T> > 
struct X 
{ 
    X(P1 p1 = {}) : _policy1(std::move(p1)) { } 

    private: 
    P1 _policy1; 
}; 

而且使用它

int main() 
{ 
    X<int, DummyPolicy> no_questions_asked; 
    X<int> use_params({42, "hello world"}); 
} 

明顯地用C++ 03或顯式構造函數拼出來:

 X<int> use_params(Policy1<int>(42, "hello world")); 

看到它Live on Coliru


更新:工廠

這裏有一個更新顯示治廠方針:

#include <string> 

namespace details 
{ 
    template <typename PolicyImpl> 
     struct PolicyFactory 
     { 
      static PolicyImpl Create() { 
       return {}; 
      } 
     }; 
} 

template <typename> 
struct Policy2 { Policy2(double) { } }; 

template <typename T, 
      typename P1 = Policy2<T> > 
struct X 
{ 
    X()  : _policy1(details::PolicyFactory<P1>::Create()) {} 
    X(P1 p1) : _policy1(std::move(p1)) { } 

    private: 
    P1 _policy1; 
}; 

///// supply a factor, possibly local to a TU: 

namespace details 
{ 
    template <typename T> 
     struct PolicyFactory<Policy2<T> > { 
      static Policy2<T> Create() { 
       return Policy2<T>(3.14); 
      } 
     }; 
} 

int main() 
{ 
    // with a factory: 
    X<std::string, Policy2<std::string> > no_params_because_of_factory; 
} 

看到它Live on Coliru *

注意

  • 我更喜歡構造函數傳遞的方式
  • 工廠在技術上是一個特質
+0

見它** [直播上Coliru(http://coliru.stacked-crooked.com/a/ 305fa1c11b570279)** – sehe

+0

@gsf增加了工廠的完整性。 – sehe

+0

感謝,似乎符合邏輯,我只是​​不確定這是最好的方式去 – gsf

4

模板中的策略用於在編譯時自定義類,而不是在運行時(策略設置實例的類型,並且不能在運行時使用C++來確定類型)。

並行運行時通常被稱爲「依賴注入」,你通過傳遞已經構造的對象到該實例將委派操作做了例子。