有没有办法使用可变参数模板实现策略模式?

时间:2012-07-12 19:32:44

标签: c++ c++11 variadic-templates strategy-pattern

我想将不同的算法封装为策略。所有策略都会提供一种可能在参数数量和类型上有所不同的方法。

template <typename... Arguments>
double price(Arguments... parameters)

策略不应该直接在课堂上使用它们编码。有没有一种使用可变参数模板实现策略设计模式的简单方法?我也知道“基于策略的设计”,我试图使用可变参数模板实现类似的东西

1 个答案:

答案 0 :(得分:5)

您的意思是,您希望策略需要不同的参数,策略的用户可以透明地转发,而不知道任何实际参数吗?

演示(做作但有说明力,我希望)。在 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