我想将不同的算法封装为策略。所有策略都将提供一种可能在参数数量和类型上有所不同的方法。
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