gpt4 book ai didi

c++ - 在requires子句中访问私有(private)成员

转载 作者:行者123 更新时间:2023-12-02 18:50:31 27 4
gpt4 key购买 nike

考虑以下程序:

#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可能存在于类中,也可能不存在。如果确实如此(如 A),则函数 f2 应该调用它,如果没有(如 B),则不应调用它。这种区别是通过 requires 子句实现的。

我在 A 中与 f2 交友,因此即使它是私有(private)的,它也应该能够调用 g (一般来说,交友效果很好,请参阅f1)。然而,requires似乎忽略了该函数是友好的,因此,当在A中将g设为私有(private)时,g 不再被调用。

这是为什么呢?是否有解决方法,即限制一个函数是否可以被调用,即使它是私有(private)的(但是友好的)?甚至可能使用老式的 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++ - 在requires子句中访问私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66860603/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com