有一篇文章解释了可以使用以下语法将模板参数声明为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行代码的复杂类怎么办?是否有没有模板专门化的替代解决方案?
我认为与假人交友是您可以做的最干净的事情,因为您不能继承或有条件地声明朋友。您甚至不需要创建新的虚拟类型,因为:
[ class.friend§3 ]
如果好友声明中的类型说明符指定了(可能是cv限定的)类类型,则将该类声明为好友;否则,将其声明为好友。否则,将忽略好友声明。
这意味着您可以假装成为朋友int,甚至可以假装void他们会过得很好。
该建议仅在C ++标准的范围内有效,无意作为现实生活的准则。张贴者不承担与实施建议有关的任何责任。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |