友元类可以在 C++11 中有条件地声明吗?[复制]

Can friend class be declared conditionally in C++11? [duplicate]

提问人:Masked Man 提问时间:12/21/2012 最后编辑:CommunityMasked Man 更新时间:12/21/2012 访问量:721

问:

这个问题在这里已经有答案了:
10年前关闭。

可能的重复:
如何有条件地声明一个好友类?

这个问题从可以在 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++ 编写的,我想在波形中显示变量。我研究了其他各种选项,并发现出于实际考虑,我需要使用好友类。朋友会捕获值并生成波形,但我更愿意只在需要波形时才让朋友,而不是一直这样。

C++ C++11 标准好

评论

2赞 K-ballo 12/21/2012
你为什么要这样?
0赞 Nawaz 12/21/2012
你想达到什么目的?
0赞 Masked Man 12/21/2012
@K-ballo,我正在硬件仿真的新研究项目中使用它。测试平台代码是用 C++ 编写的,我想提供一个新功能,以便在仿真期间查看波形中的成员变量值。友元类将捕获值并生成波形。我希望那个朋友只在需要波形时在场,而不是总是在场。
3赞 Masked Man 12/21/2012
顺便问一下,为什么要投反对票并关闭?我问这个问题是为了解决一个实际问题。对于你们软件人来说,这可能是不寻常的,闻所未闻的,但这并不意味着我不应该被允许问它。
0赞 Masked Man 12/21/2012
请不要关闭这个问题。我已经在上面的评论中解释了我想要实现的目标。如果这个问题需要改进,请解释一下您希望我详细说明的内容。

答:

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
  };
};

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