提问人:Masked Man 提问时间:12/21/2012 最后编辑:CommunityMasked Man 更新时间:12/21/2012 访问量:721
友元类可以在 C++11 中有条件地声明吗?[复制]
Can friend class be declared conditionally in C++11? [duplicate]
问:
可能的重复:
如何有条件地声明一个好友类?
这个问题从可以在 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赞
BЈовић
12/21/2012
#1
[class.friend]/3 告诉这个:
未声明函数的友元声明应具有以下形式之一:
友元 elaborated-type-specifier ;
friend simple-type-specifier 简单类型说明符 ;
friend typename-specifier 朋友 typename-specifier ;
因此,不可能有条件地声明类的好友。
实际上,您可以使用宏来完成:
class Foo {
#ifdef DECLARE_A_FRIEND
friend class Bar;
#endif
};
};
然后定义或取消定义宏作为编译参数。
评论