1

重複の可能性:
条件付きで友達クラスを宣言する方法は?

この質問は、C ++ 03で条件付きでフレンドクラスを宣言できますか?。具体的には、C ++ 11は、条件付きでフレンドクラスを宣言するのに役立つ追加のオプションを提供しますか?つまり、C ++ 11でこれを行うことは可能ですか?

cplusplus.comを調べてみると、に出くわしstd::enable_ifました。使ってみましたが、正しい構文がわかりませんでした。std::enable_ifこの目的に使用するのに適切な構成ですか?以下は、そこに示されている例に基づいて、私が試したコードです。ここでは実際にはテンプレートは必要ありませんが、そこに示されているすべてのサンプルコードでテンプレートが使用されているため、テンプレートを回避する方法がわかりません。

class Foo {
  template<typename T> struct std::enable_if<true, T> {
      typedef T Bar;
      friend class Bar;
  };
};

これにより、次のコンパイルエラーメッセージが表示されます。

prog.cpp:5:36: error: 'enable_if' is not a template
prog.cpp:5:55: error: qualified name does not name a class before '{' token

以下のコメントで説明されているように、これをより見やすくするために編集してください。この要件は珍しいものです。これは、私が取り組んでいるハードウェアシミュレーションの新しい研究プロジェクトの一部です。テストベンチはC++で記述されており、変数を波形で表示したいと思います。私は他のさまざまなオプションを調査しましたが、実際的な考慮事項から、フレンドクラスを使用する必要があることがわかりました。友人は値をキャプチャして波形を生成しますが、波形が必要な場合にのみ友人がいることを望みます。常にではありません。

4

1 に答える 1

1

[class.friend] / 3はこれを伝えます:

関数を宣言しないfriend宣言は、次のいずれかの形式になります
。friend elaborated-type-specifier;
フレンドsimple-type-specifier;
フレンドtypename-specifier;

したがって、クラスの友達を条件付きで宣言することはできません。

実際には、マクロでそれを行うことができます:

class Foo {

#ifdef DECLARE_A_FRIEND
      friend class Bar;
#endif
  };
};

次に、マクロをコンパイルパラメータとして定義または定義解除します。

于 2012-12-21T06:58:39.007 に答える