C++ 是否可以编写一个trait来检测友元类声明?

C++ 是否可以编写一个trait来检测友元类声明?,c++,c++17,sfinae,friend,detection-idiom,C++,C++17,Sfinae,Friend,Detection Idiom,我想知道是否有可能编写一个能够检测友元类声明的trait。我对远期申报特别感兴趣,比如: struct Baz { friend struct Foo; }; struct Foo {}; 请不要使用Boost或其他外部库。答案应该与标准(C++17)或自定义特性保持一致。您将如何使用此功能?围绕这样一个结构做一些事情似乎是不合理的。@Nicolas我正在写一个基于模板元编程的反射库。为了允许反射系统检查类型(在其私有成员内)必须执行友元声明:template friend stru

我想知道是否有可能编写一个能够检测友元类声明的trait。我对远期申报特别感兴趣,比如:

struct Baz
{
   friend struct Foo; 
};

struct Foo {};

请不要使用Boost或其他外部库。答案应该与标准(C++17)或自定义特性保持一致。

您将如何使用此功能?围绕这样一个结构做一些事情似乎是不合理的。@Nicolas我正在写一个基于模板元编程的反射库。为了允许反射系统检查类型(在其私有成员内)必须执行友元声明:
template friend struct reflection::ReflectedTypeInternal
我想检测该友元声明是否存在,以便最终抛出编译时错误并简化库的使用。当您尝试反射到类型中失败时,您不会抛出编译错误吗?@nicolas我会这样做已经是这样了。但检测到友元声明将允许我在编译的早期阶段抛出可读性更好的错误。否则,我将不得不依赖于后面的编译错误,这些错误是不容易理解的。您可以创建一个helper宏来生成这个friend声明,还可以创建一些隐藏的标记类型,稍后可以检测到。我认为你无法发现这个朋友本身。