c++ - 在 requires 子句中访问私有成员
问题描述
考虑以下程序:
#include <iostream>
template<typename T> void f1(T& v)
{
std::cout << "f1: can call g" << std::endl;
v.g();
}
template<typename T> void f2(T& v) requires requires (T& v) { v.g(); }
{
std::cout << "f2: can call g" << std::endl;
v.g();
}
template<typename T> void f2(T&) requires (!requires (T& v) { v.g(); })
{
std::cout << "f2: cannot call g" << std::endl;
}
class A
{
public: // if commented out, f2 will not call g anymore
void g()
{
std::cout << "g called" << std::endl;
}
template<typename T> friend void f1(T& v);
template<typename T> friend void f2(T& v);
};
class B
{
};
int main()
{
std::cout << "A" << std::endl;
A a{};
f1(a);
f2(a);
std::cout << "B" << std::endl;
B b{};
f2(b);
return 0;
}
该函数g
可能存在于一个类中,也可能不存在。如果是(如 for A
),则该函数f2
应调用它,如果不是(如 for B
)则不应。这种区别是通过requires
子句进行的。
我结识f2
了,所以即使它是私人的A
,它也应该能够打电话(一般来说,结识很好,请参阅)。但是,似乎忽略了该函数已成为朋友,因此在将其设为私有时,不再调用该函数。g
f1
requires
g
A
g
为什么是这样?是否有解决方法,即决定是否可以调用函数,即使它是私有的(但已成为朋友)?也许甚至使用老学校std::enable_if
?
解决方案
当您为函数或函数模板添加好友时,只有该函数的主体才能获得访问权限,而不是其各种附件。附加到它的约束是无关的。
您可以通过将检查移动到 的主体内来解决此问题f2
,以便在具有此访问权限的上下文中检查它:
template <typename T>
void f2(T& v)
{
if constexpr (requires { v.g(); }) {
std::cout << "f2: can call g\n";
v.g();
} else {
std::cout << "f2: cannot call g\n";
}
}
推荐阅读
- c# - 迭代地从字符串的反身属性中检索值时出现 TargetParameterCountException
- javascript - Babel plugin-proposal-decorators 没有按预期工作
- python - Django div重新加载 - POST后的ajax GET没有获取最新的数据库模型实例
- php - 递归 AJAX 调用被取消
- navigation - 如何在 Flutter 的显示对话框中使用单选按钮进行导航?
- spring-boot - 在 Apache ignite、Spring boot 中启用/禁用二级缓存
- javascript - 获取鼠标在 3d div 上的点击位置
- python - CPython 27m 和 27mu 有什么区别?
- php - 仅将唯一值插入数据库表
- arrays - 使用 rnn 函数时出现以下错误: x %*% model$time_synapse[[i]] 中的错误:需要数字/复数矩阵/向量参数