1

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

这个问题从Can朋友类在 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 告诉这个:

未声明函数的友元声明应具有以下形式之一:
友元详述类型说明符;
朋友简单类型说明符;
朋友类型名说明符;

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

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

class Foo {

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

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

于 2012-12-21T06:58:39.007 回答