繁体   English   中英

如何将自动 lambda 参数约束为指向成员 function 的指针?

[英]How to constrain an auto lambda parameter to a pointer to member function?

我有一个通用的 lambda function 需要接受指向成员函数的指针作为参数。 我当然可以简单地使用auto ,编译器会推断出正确的类型。 但是,在可能的情况下,我更喜欢在适当的地方用*&const装饰我的自动参数,从而更好地传达推导类型的性质和意图。 如果我只是将auto参数设为 auto auto* ,则会出现编译器错误,对此我并不感到惊讶,因为auto*表示常规指针,而不是指向成员的指针。 是否有一些语法可以约束auto参数以接受指向成员的指针,或者我应该只使用auto并忘记它?

int main()
{
    struct S { void m() {} };

    //auto l = [](auto* pmf) // ERROR
    //auto l = [](const auto& pmf) // Works, but uh, bit misleading I think
    auto l = [](auto pmf)
    {
        S s;
        (s.*pmf)();
    };

    l(&S::m);
}

您可以将其声明为:

auto l = [](auto S::*pmf)

它确实将指针绑定到S类型,但这是有道理的,因为您将使用它。

在 C++20 中,你可以用一个概念来约束它:

#include <type_traits>

template <typename T>
concept MemberPointer = std::is_member_pointer_v<T>;

void test() {
    auto foo = [](MemberPointer auto memPtr) {};
}

您可以使用 C++20 requires -clause 来执行此操作:

#include <type_traits>

auto l = [](auto pmf) requires std::is_member_function_pointer_v<decltype(pmf)>
{
  S s;
  (s.*pmf)();
};

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM