簡體   English   中英

C ++策略類和名稱空間

[英]C++ policy classes and namespaces

我已經實現了基於策略的課程。 目前,類模板及其策略類在稱為實用程序的名稱空間中聲明。

我面臨的問題是結果代碼的詳細程度。 客戶端代碼如下所示:

utility::MyTool<utility::AFirstPolicy, utility::ASecondPolicy>
my_function(utility::MyTool<utility::AnotherFirstPolicy, utility::AnotherSecondPolicy>);

如您所見,它不是很可讀。 我想更進一步地了解:

MyTool<AFirstPolicy, ASecondPolicy>
my_function(MyTool<AnotherFirstPolicy, AnotherSecondPolicy>);

我想知道在這種情況下的良好做法是什么。 這是我能想到的:

Typedef

最明顯的解決方案。 對於我來說不是很方便,因為策略可能因功能而異,從而帶來有關功能使用的重要信息。 我希望它們直接出現在函數原型中。 此外,它在幾個名稱空間中引入了許多類型名稱。

使用指令

放一個using namespace utility; using utility::MyTool; using utility::AFirstPolicy; using utility::MyTool; using utility::AFirstPolicy; ,等等。

該工具通常用於其他命名空間的頭文件中,這使得using指令不太適合。

全局名稱空間中的策略類

我不喜歡這種方法,特別是因為策略類通常具有僅在其上下文中才有意義的模糊名稱。

巨集

使用作為

#define MY_TOOL(pcy1, pcy2) utility::MyTool<utility::##pcy1, utility::##pcy2>

將先前的代碼轉換為

MY_TOOL(AFirstPolicy, ASecondPolicy)
my_function(MY_TOOL(AnotherFirstPolicy, AnotherSecondPolicy));

我不確定這是否更具可讀性。 它僅適用於固定數量的策略(這是我的情況:始終為2,沒有默認設置),並且如果策略類本身帶有模板參數,則它不起作用。

您會向我推薦以前哪種方法? 是否有“最佳做法”? 另一個主意?

如果您有my_function(utility::MyTool<...>) ,那么我會說my_function屬於類模板utility::MyTool<...> 換句話說, my_function本身屬於namespace utility

這意味着您可以以所需的速記形式編寫代碼:

namespace utility {   
    typedef MyTool<AFirstPolicy, ASecondPolicy> SomeTool;
    my_function(SomeTool);    
}

您可以 Herb Sutter的舊專欄“類中的內容”中閱讀有關接口和名稱空間的更多信息。

請注意,即使您想將其他命名空間中的函數與namespace utility類一起使用,也仍然可以重新打開該命名空間並在那里定義策略類,然后執行類似的操作

// SomeHeader.hpp
namespace bla {
   // your classes and functions
}

// reopen namespace utility
namespace utility {   
    typedef MyTool<AFirstPolicy, ASecondPolicy> SomeTool;
}

namespace bla {
    typedef utility::SomeTool BlaTool; // or using-declaration
    my_function(BlaTool);
}

當然,這比在實用程序名稱空間中定義my_function更為冗長,但是至少您可以在不進行過多鍵入的情況下組合所有各種策略。

暫無
暫無

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

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