首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将自动lambda参数约束为指向成员函数的指针?

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

Stack Overflow用户
提问于 2022-02-03 15:04:13
回答 3查看 94关注 0票数 2

我有一个泛型lambda函数,它需要接受一个指针到成员函数作为参数。当然,我可以单独使用auto,编译器将推断出正确的类型。但是,在可能的情况下,我更愿意在适当的情况下用*&const来装饰我的汽车参数,从而更好地交流推断类型的性质和意图。如果我简单地将auto参数设置为auto*,我就会得到一个编译器错误,这并不令我感到惊讶,因为auto*表示的是一个常规指针,而不是指针到成员。是否有一些语法来约束auto参数以接受指针到成员,还是应该使用auto而忘记它?

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-03 15:10:22

你可以宣布它为:

代码语言:javascript
复制
auto l = [](auto S::*pmf)

它确实将指针绑定到S类型,但这是有意义的,因为您将以这种方式使用它。

票数 3
EN

Stack Overflow用户

发布于 2022-02-03 15:15:16

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

代码语言:javascript
复制
#include <type_traits>

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

void test() {
    auto foo = [](MemberPointer auto memPtr) {};
}
票数 1
EN

Stack Overflow用户

发布于 2022-02-03 15:16:29

您可以使用C++20 requires-clause来完成以下操作:

代码语言:javascript
复制
#include <type_traits>

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

演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70973619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档