使可选模板参数成为朋友?

Ale*_*sky 3 c++ c++17

有一篇文章解释了可以使用以下语法将模板参数声明为friend:

template <typename T>
class A {
   friend T;
};
Run Code Online (Sandbox Code Playgroud)

但是如果在某些情况下A需要油炸而在其他情况下则不需要油炸怎么办?是否可以将T作为可选参数?

是否有比使用某种FakeClass作为T更好的解决方案?

EDIT1:我找到了另一个解决方案:

    class B {};

    template <typename T>
    class A {
       friend T;
    };

    template <>
    class A<void> {
    };

int main()
{
    A<B> a1;
    A<void> a2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果A是具有300行代码的复杂类怎么办?是否有没有模板专门化的替代解决方案?

Que*_*tin 7

我认为与假人交友是您可以做的最干净的事情,因为您不能继承或有条件地声明朋友。您甚至不需要创建新的虚拟类型,因为:

[ class.friend§3 ]

如果好友声明中的类型说明符指定了(可能是cv限定的)类类型,则将该类声明为好友;否则,将其声明为好友。否则,将忽略好友声明

这意味着您可以假装成为朋友int,甚至可以假装void他们会过得很好。

该建议仅在C ++标准的范围内有效,无意作为现实生活的准则。张贴者不承担与实施建议有关的任何责任。

  • 假人也需要朋友。这不是坏建议。 (2认同)