我想仅在某些(编译时)条件为真时才声明友元类.例如:
// pseudo-C++
class Foo {
if(some_compile_time_condition) {
friend class Bar;
}
};
Run Code Online (Sandbox Code Playgroud)
我没有在互联网上找到任何解决方案.我在编译时动态地完成了生成结构问题的所有答案.他们中的许多人使用C++ 11 std::conditional,但我想知道是否可以在不使用预处理器的情况下在C++ 03中执行此操作.
此解决方案/sf/answers/796369731/将无法工作,因为friend未继承船舶(具有继承的朋友类).
编辑只是为了使这更容易看到,如下面评论中所述:此要求不常见.这是我正在研究的硬件模拟新研究项目的一部分.测试平台是用C++编写的,我想在波形中显示变量.我已经研究了各种其他选项,并且friend class由于实际考虑,我发现我需要使用a .朋友将捕获值并生成波形,但我更愿意仅在需要波形时才拥有朋友,而不是所有时间.
用friend std::conditional<C, friendclass, void>::type;这里C是你的条件.非类型的朋友将被忽略.
条件模板很容易在C++ 03中实现.但是,由于C++ 03不支持typedef的朋友,你需要在那里使用以下语法
namespace detail { class friendclass {}; }
class Foo {
friend class std::conditional<C,
friendclass, detail::friendclass>::type::friendclass;
};
Run Code Online (Sandbox Code Playgroud)
请注意,详细虚拟类名称需要与此变通方法中潜在朋友的名称匹配.