以密鑰為導向的存取保護模式的可重用性
面向金鑰的存取保護模式提供了一種簡潔而富有表現力的存取控制方式是基於關鍵物件的方法和函數。然而,該模式目前在可重用性方面受到限制。
C 03 中的改進
提高C 03 中可重用性的一種方法是使用宏來定義密鑰組:
#define PASSKEY_1(pKeyname, pFriend1) \ class EXPAND(pKeyname) \ { \ private: \ friend EXPAND(pFriend1); \ EXPAND(pKeyname)() {} \ \ EXPAND(pKeyname)(const EXPAND(pKeyname)&); \ EXPAND(pKeyname)& operator=(const EXPAND(pKeyname)&); \ } #define PASSKEY_2(pKeyname, pFriend1, pFriend2) \ class EXPAND(pKeyname) \ { \ private: \ friend EXPAND(pFriend1); \ friend EXPAND(pFriend2); \ EXPAND(pKeyname)() {} \ \ EXPAND(pKeyname)(const EXPAND(pKeyname)&); \ EXPAND(pKeyname)& operator=(const EXPAND(pKeyname)&); \ }
但這個方法仍然需要呼叫者知道特定的passkey它需要建立並且為函數建立金鑰可能很麻煩。
C 0x 的改進
C 0x 引入了對密鑰模式的重大改進,支援完整的模板生成。透過可變參數模板和模板參數的友誼,以下程式碼展示了改進的實現:
// Each class has its own unique key only it can create template <typename T> class passkey { private: friend T; // C++0x, MSVC allows as extension passkey() {} // Noncopyable passkey(const passkey&) = delete; passkey& operator=(const passkey&) = delete; }; // Functions still require a macro. This is because a friend function requires // the entire declaration, which is not just a type, but a name as well. We do // this by creating a tag and specializing the passkey for it, friending the function #define EXPAND(pX) pX // We use variadic macro parameters to allow // functions with commas, it all gets pasted // back together again when we friend it #define PASSKEY_FUNCTION(pTag, pFunc, ...) \ struct EXPAND(pTag); \ \ template <> \ class passkey<EXPAND(pTag)> \ { \ private: \ friend pFunc __VA_ARGS__; \ passkey() {} \ \ passkey(const passkey&) = delete; \ passkey& operator=(const passkey&) = delete; \ }
這種增強的實現消除了早期 C 03 解決方案的兩個缺點。呼叫者不再需要猜測要使用哪個金鑰,樣板程式碼一般會處理金鑰建立和函數交友,只需要最少的額外定義。
以上是我們如何提高 C 語言中面向金鑰的存取保護模式的可重複使用性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!