2

さまざまなアルゴリズムを戦略としてカプセル化したいと思います。すべての戦略は、パラメーターの数とタイプが異なる可能性のある単一のメソッドを提供します。

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

戦略は、それらを使用してクラスに直接コーディングしないでください。可変個引数テンプレートを使用して戦略設計パターンを実装する簡単な方法はありますか? 「ポリシーベースの設計」も認識しており、可変個引数テンプレートを使用して同様のことを達成しようとしています

4

1 に答える 1

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
于 2012-07-12T21:27:21.130 に答える