面向密钥的访问保护模式的可重用性
面向密钥的访问保护模式提供了一种简洁而富有表现力的访问控制方式基于关键对象的方法和函数。然而,该模式目前在可重用性方面受到限制。
C 03 中的改进
提高 C 03 中可重用性的一种方法是使用宏来定义密钥组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #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 引入了对密钥模式的重大改进,支持完整的模板生成。通过可变参数模板和模板参数的友谊,以下代码展示了改进的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | template <typename T>
class passkey
{
private :
friend T;
passkey() {}
passkey( const passkey&) = delete ;
passkey& operator=( const passkey&) = delete ;
};
#define EXPAND(pX) pX
#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中文网其他相关文章!