91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

C++模板元編程如何實現策略模式

c++
小樊
82
2024-10-25 05:03:56
欄目: 編程語言

在C++中,模板元編程(TMP)是一種在編譯時執行計算的技術,它允許程序員編寫在編譯時生成和優化代碼的程序。策略模式是一種行為設計模式,它允許在運行時選擇算法的行為。結合TMP和策略模式,我們可以在編譯時根據不同的類型選擇不同的算法實現。

以下是一個使用C++模板元編程實現策略模式的示例:

首先,我們定義一個策略接口,通常使用純虛函數表示:

template <typename T>
class Strategy {
public:
    virtual ~Strategy() = default;
    virtual T execute(const T& input) const = 0;
};

然后,我們為每種具體策略實現這個接口。例如,我們可以有一個加法策略和一個乘法策略:

template <typename T>
class AddStrategy : public Strategy<T> {
public:
    T execute(const T& input) const override {
        return input + input;
    }
};

template <typename T>
class MultiplyStrategy : public Strategy<T> {
public:
    T execute(const T& input) const override {
        return input * input;
    }
};

接下來,我們創建一個上下文類,它包含一個指向策略對象的指針,并使用模板特化來根據類型選擇合適的策略:

template <typename T, typename StrategyType = void>
class Context;

template <typename T>
class Context<T, std::enable_if_t<!std::is_same_v<Strategy<T>, MultiplyStrategy<T>>>> {
public:
    Context(Strategy<T>* strategy) : strategy_(strategy) {}

    T execute(const T& input) const {
        return strategy_->execute(input);
    }

private:
    Strategy<T>* strategy_;
};

template <typename T>
class Context<T, std::enable_if_t<std::is_same_v<Strategy<T>, MultiplyStrategy<T>>>> {
public:
    Context(Strategy<T>* strategy) : strategy_(strategy) {}

    T execute(const T& input) const {
        return strategy_->execute(input * input);
    }

private:
    Strategy<T>* strategy_;
};

注意,這里使用了std::enable_if和SFINAE(Substitution Failure Is Not An Error)技術來根據模板參數的類型選擇不同的上下文類實現。

最后,我們可以使用這些類來執行不同的策略:

int main() {
    Context<int> addContext(&AddStrategy<int>());
    Context<int> multiplyContext(&MultiplyStrategy<int>());

    int resultAdd = addContext.execute(5);  // 結果為 5 + 5 = 10
    int resultMultiply = multiplyContext.execute(5);  // 結果為 5 * 5 = 25

    return 0;
}

在這個例子中,Context類根據模板參數T的類型在編譯時選擇合適的策略實現。注意,由于策略模式和模板元編程都是在編譯時工作的,因此運行時的性能開銷非常小。

0
家居| 南通市| 常熟市| 象山县| 山丹县| 峡江县| 永康市| 凤台县| 嵊州市| 巴里| 乌拉特后旗| 章丘市| 平潭县| 宁城县| 广灵县| 璧山县| 社旗县| 图木舒克市| 慈利县| 海伦市| 钟祥市| 娱乐| 福建省| 内乡县| 南宁市| 工布江达县| 敖汉旗| 荃湾区| 册亨县| 双流县| 洪江市| 浮梁县| 临漳县| 元朗区| 万源市| 北碚区| 鹿邑县| 五原县| 五指山市| 泸溪县| 阿巴嘎旗|