我想封装不同的算法作为策略。所有的策略都会提供一个可能在参数数量和类型上不同的单一方法。有没有使用可变参数模板实现策略模式的方法?
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