朋友类可以在C ++ 11中有条件地声明吗?

时间:2012-12-21 06:33:52

标签: c++ c++11 std friend

  

可能重复:
  How to declare a friend class conditionally?

这个问题从Can friend class be declared conditionally in 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 ++编写的,我想在波形中显示变量。我已经研究了各种其他选项,并且由于实际考虑,我发现我需要使用朋友类。朋友将捕获值并生成波形,但我更愿意仅在需要波形时才拥有朋友,而不是所有时间。

1 个答案:

答案 0 :(得分:1)

[class.friend] / 3告诉我:

  

未声明功能的朋友声明应具有以下形式之一:
    朋友详细说明了类型说明符;
    朋友简单类型说明符;
    朋友typename-specifier;

因此,不可能有条件地声明一个班级的朋友。

实际上,你可以用宏来做到这一点:

class Foo {

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

然后将宏定义或取消定义为编译参数。