通过静态成员功能使ADL工作

Make ADL work with static member functions

本文关键字:ADL 工作 功能 静态成员      更新时间:2023-10-16

我的同事定义了无状态类函数的一堆功能(我认为应该是免费的功能)。
由于该类是定义的,并使用嵌套名称空间中的类型,因此我想使用ADL来编写较少的不使用代码。但是,他们的选择并没有打破ADL的目的?

namespace nested_long_namespace_name
{
    struct type {};
    struct interface { static void f(type) {} };
}
int main()
{
    nested_long_namespace_name::type value{};
    f(value);                                        // ERROR (ADL does not kick in)
    interface::f(value);                             // ERROR (ADL does not kick in)
    nested_long_namespace_name::interface::f(value); // OK
}

现在,我的问题是:是否有其他将f定义为命名空间nested_long_namespace_name中的免费功能的解决方法?

与参数依赖性查找仅在名称空间中声明的声明,并且仅在无限制的查找过程中发生。因此,ADL永远不会适用于interface::f(value),但确实适用于f(value)。但是,只有在名称空间nested_long_namespace_name下寻找f的名称 - 我们将不会继续在静态功能的那些关联的名称空间或名为f的数据成员中声明的类中。

这遵循典型的名称查找模型 - 您可以使用directive 具有将命名空间带入范围的,但是没有等效的将静态类成员纳入范围。

是的,interface::f无法通过ADL找到。