簡體   English   中英

基於策略的設計-策略實現必須訪問主機類的成員

[英]Policy based design - policy implementation has to access members of the host class

我認為解釋我的問題的最好方法是使用一段代碼:

class IncreasingMultiplier {

protected:

    IncreasingMultiplier(int initialMultiplier = 0, int incrementation = 1)

    int getMultiplier() {
        mCurrentMultiplier += mIncrementation;
        return mCurrentMultiplier - mIncrementation;
    }

    void setMultiplier(int multiplier) {
        mCurrentMultiplier = multiplier;
    }

    void setIncrementation(int incrementation) {
        mIncrementation = incrementation;
    }

private:

    int mCurrentMultiplier;
    int mIncrementation;`

}

class ConstMultiplier {

protected:

    int getMultiplier() const {
        return 10;
    }

}


class NumberLogger {

public:

    void log() {

        int currentNumber = getNumber(); // How can I call this method?

        std::cout << "Current number is " << currentNumber << std::endl;

    }

}



template<

    class MultiplierPolicy,

    class LoggingPolicy

>
class Host : public MultiplierPolicy, public LoggingPolicy {

public:

    int getNumber() const {
        return mNumber * getMultiplier();

    }

private:


    int mNumber;

}

基本上,一個策略可能需要訪問在主機類中定義的成員,這些成員又取決於提供給該主機類的其他策略。

謝謝!

以下代碼可通過VS2013進行編譯(尚未在GCC上嘗試過):

#include <iostream>

class IncreasingMultiplier {

protected:

    IncreasingMultiplier(int initialMultiplier = 0, int incrementation = 1)
        : mCurrentMultiplier(initialMultiplier)
        , mIncrementation(incrementation)
    {}

    int getMultiplier() {
        mCurrentMultiplier += mIncrementation;
        return mCurrentMultiplier - mIncrementation;
    }

    void setMultiplier(int multiplier) {
        mCurrentMultiplier = multiplier;
    }

    void setIncrementation(int incrementation) {
        mIncrementation = incrementation;
    }

private:

    int mCurrentMultiplier;
    int mIncrementation;
};

class ConstMultiplier {

protected:

    int getMultiplier() const {
        return 10;
    }

};

// Template the logger policy
// Unfortunately - couldn't get host inheritance CRTP pattern
// compiling in Visual Studio 2013 :(
// https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
template < typename t_Host >
class NumberLogger /*: public t_Host*/ {

public:

    void log() {
        // This part of the CRTP pattern does work in Visual Studio 2013
        int currentNumber = static_cast<t_Host*>(this)->getNumber(); // How can I call this method?

        std::cout << "Current number is " << currentNumber << std::endl;
    }

};

// Template based on a list of policies
template<
    typename PoliciesList
>
class Host : public PoliciesList::MultiplierPolicy, public PoliciesList::LoggingPolicy {

public:

    Host() : mNumber(1) {}

    int getNumber() /*const*/ {
        return mNumber * getMultiplier();
    }

private:

    int mNumber;
};

// Un-templated policies list
// Could create a macro to declare various policy combinations:
class ConcretePoliciesList_Const
{
public:
    typedef Host<ConcretePoliciesList_Const> MyHost;
    typedef ConstMultiplier MultiplierPolicy;
    typedef NumberLogger<MyHost> LoggingPolicy;
};

class ConcretePoliciesList_Increasing
{
public:
    typedef Host<ConcretePoliciesList_Increasing> MyHost;
    typedef IncreasingMultiplier MultiplierPolicy;
    typedef NumberLogger<MyHost> LoggingPolicy;
};

int main()
{
    ConcretePoliciesList_Const::MyHost const_host;
    ConcretePoliciesList_Increasing::MyHost increasing_host;

    std::cout << "Const policy:" << std::endl;
    const_host.log();
    const_host.log();
    const_host.log();

    std::cout << "Increasing policy:" << std::endl;
    increasing_host.log();
    increasing_host.log();
    increasing_host.log();

    return 0;
}

結果輸出為:

Const policy:
Current number is 10
Current number is 10
Current number is 10
Increasing policy
Current number is 0
Current number is 1
Current number is 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM