以下内容参考自谷歌的代码:
原文地址
Passkey 模式用于以比简单地将其他类设置为友元类更细粒度的方式将类的部分方法暴露给另一个类。本质上,它涉及创建一个“passkey”类,该类只能由特定的其他类构造,并要求在调用您希望限制使用的方法时传入该 passkey 类的实例。其用法如下:
class Foo {public:Foo();~Foo();void NormalPublicMethod();bool AnotherNormalPublicMethod(int a, int b);class BarPasskey {private:friend class Bar;BarPasskey() = default;~BarPasskey() = default;};void HelpBarOut(BarPasskey, ...);
};...void Bar::DoStuff() {foo->HelpBarOut(Foo::BarPasskey(), ...);
}
Foo::BarPasskey 上的私有构造函数阻止除了 Bar 以外的任何类构造 Foo::BarPasskey,这意味着:
- 只有 Bar 可以调用这些方法
- Bar 可以通过将 Foo::BarPasskey 实例传递给其他类/函数来委托调用这些方法的能力
这种方法在运行时实际上是免费的 - 会使用一些额外的字节的参数空间来传递 Passkey 对象。
鼓励将 BarPasskey 参数命名为未命名,以加强它不携带语义信息并且实际上不用于任何事情的概念。