キー指向のアクセス保護パターンの再利用性
キー指向のアクセス保護パターンは、アクセスを制御するための簡潔かつ表現力豊かな方法を提供しますキーオブジェクトに基づいてメソッドと関数を作成します。ただし、現時点では、パターンは再利用性の点で制限されている可能性があります。
C 03 の改善点
C 03 の再利用性を向上させる方法の 1 つは、マクロを使用してパスキー グループを定義することです。 :
#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)&); \ }
ただし、このメソッドでも、呼び出し元は作成する必要がある特定のパスキーを知っている必要があります。
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 中国語 Web サイトの他の関連記事を参照してください。