For the Chromium implementation of this pattern, see //base/util/type_safety/pass_key.h.
The Passkey pattern is used when you need to expose a subset of a class's methods to another class in a more granular way than simply friending the other class. In essence, it involves creating a “passkey” class that can only be constructed by specific other classes, and requiring an instance of that passkey class to be passed in when calling methods you wish to restrict the use of. It is used like this:
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(), ...); }
The private constructor on Foo::BarPasskey
prevents any class other than Bar
from constructing a Foo::BarPasskey
, which means that:
Bar
can call those methodsBar
can delegate the ability to call those methods to other classes/functions by passing them a Foo::BarPasskey
instanceThis method is effectively free at runtime - a few extra bytes of argument space are used to pass in the Passkey object.
It is encouraged to leave the BarPasskey
parameter unnamed to reinforce that it carries no semantic information and is not actually used for anything.