这个问题从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 ++编写的,我想在波形中显示变量。我已经研究了各种其他选项,并且由于实际考虑,我发现我需要使用朋友类。朋友将捕获值并生成波形,但我更愿意仅在需要波形时才拥有朋友,而不是所有时间。
答案 0 :(得分:1)
[class.friend] / 3告诉我:
因此,不可能有条件地声明一个班级的朋友。未声明功能的朋友声明应具有以下形式之一:
朋友详细说明了类型说明符;
朋友简单类型说明符;
朋友typename-specifier;
实际上,你可以用宏来做到这一点:
class Foo {
#ifdef DECLARE_A_FRIEND
friend class Bar;
#endif
};
};
然后将宏定义或取消定义为编译参数。