[英]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>);
我想知道在這種情況下的良好做法是什么。 這是我能想到的:
最明顯的解決方案。 對於我來說不是很方便,因為策略可能因功能而異,從而帶來有關功能使用的重要信息。 我希望它們直接出現在函數原型中。 此外,它在幾個名稱空間中引入了許多類型名稱。
放一個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.