我想封裝不同的算法作爲策略。所有的策略都會提供一個可能在參數數量和類型上不同的單一方法。有沒有使用可變參數模板實現策略模式的方法?
template <typename... Arguments>
double price(Arguments... parameters)
這些策略不應該直接在類中使用它們進行編碼。是否有一種使用可變參數模板實現策略設計模式的簡單方法?我也意識到「基於策略的設計」,我試圖用可變參數模板來實現類似的目標。
我想封裝不同的算法作爲策略。所有的策略都會提供一個可能在參數數量和類型上不同的單一方法。有沒有使用可變參數模板實現策略模式的方法?
template <typename... Arguments>
double price(Arguments... parameters)
這些策略不應該直接在類中使用它們進行編碼。是否有一種使用可變參數模板實現策略設計模式的簡單方法?我也意識到「基於策略的設計」,我試圖用可變參數模板來實現類似的目標。
你的意思是,你想要有需要不同參數的策略,可以被用戶透明地轉發該策略在不知道任何實際參數的情況下?
演示(做作,但說明,我希望)。看到它住在http://ideone.com/MExyx
#include <string>
#include <iostream>
struct StratA {
enum gender { male, female, unknown };
double price(std::string name, int age, gender g) const
{ return 42; }
};
struct StratB {
double price(int age, int volume, double historic_rate) const
{ return (age*age*historic_rate)/volume; }
};
template <typename PricingStrategy=StratA>
struct SomeEngine
{
template <typename... Args>
void doSomethingInvolvingPricing(std::string logmessage,
Args... args) // involving pricing
{
std::cout << logmessage << ": " << PricingStrategy().price(std::forward<Args>(args)...) << '\n';
}
};
int main()
{
SomeEngine<>().doSomethingInvolvingPricing("default", "name", 18, StratA::female);
SomeEngine<StratB>().doSomethingInvolvingPricing("overridden", 18, 3000, 4.5);
}
輸出(也ideone):
default: 42
overridden: 0.486
Sehe它看起來完全像我想要做的:)讓我試試這個,並回答任何問題......謝謝! :) – BigONotation 2012-07-12 21:39:26
你正在尋找運行時或編譯時多態? GoF策略模式涉及前者,但術語「策略」已變得更加模糊,還包括後者。 – mavam 2012-07-12 20:19:08
你如何期待這個工作?假設你可以合法地完成這個任務,價格(...)的調用者將如何知道提供哪些參數,因爲他們提前沒有意識到實際的參數。 – 2012-07-12 20:48:43
我一直在考慮編譯時多態,相當於使用可變參數模板的http://en.wikipedia.org/wiki/Policy-based_design。我只是好奇地發現它是否可行,還有它是否具有優勢 – BigONotation 2012-07-12 21:02:31