カプセル化に関するキーワードの一般的な使用例は知っていますが、 「仕事を終わらせる」ためだけにキーワードfriend
が必要になったことが何度かありました。friend
これらのユースケースは私を満足させないので、いくつかの代替案があるかどうか疑問に思っています. 最初の最小限の例を次に示します。
struct Foo{
enum class Bar{
a=1,b=2,c=4
};
// need to tell the compiler of operator| before it gets used
// but it can't be a member function of Foo: so add friend keyword
friend Bar operator|(const Bar& b1, const Bar& b2);
// constructor needs a default value using
// operator| for Bars
Foo( Bar b = Bar::a | Bar::b );
};
// definition of operator|, etc.
デフォルト値がコンストラクター宣言で指定される前に、コンパイラーがインターフェイス内のネストされたクラスの宣言を確認する方法はありますか?operator|
Foo
friend
また、テンプレート内でネストされたクラスの対称操作を定義する際に、キーワードを使用していることに気付くこともあります。例えば:
template<typename T>
struct A{
struct B{
friend bool operator==(const B& x, const B& y) { return true; }
};
};
はoperator==
、カプセル化の観点から友情を必要としません。しかし、operator==
実際にはテンプレート化された関数ではなく、コンパイラーがテンプレート内のネストされたクラスの型を推測できないため、これはoperator==
フリー関数として保持する唯一の合理的な「トリック」のようです。
私が言ったように、これらの選択は機能しますが、より良い選択/実践があるかどうか疑問に思っています.