如何将自动 lambda 参数约束为指向成员函数的指针?
How to constrain an auto lambda parameter to a pointer to member function?
我有一个通用的 lambda 函数,它需要接受指向成员函数的指针作为参数。我当然可以简单地单独使用 auto
,编译器将推断出正确的类型。但是,在可能的情况下,我更喜欢在适当的地方用 *
、&
和 const
修饰我的自动参数,从而更好地传达推导类型的性质和意图。如果我简单地将 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
-子句来执行此操作:
#include <type_traits>
auto l = [](auto pmf) requires std::is_member_function_pointer_v<decltype(pmf)>
{
S s;
(s.*pmf)();
};
我有一个通用的 lambda 函数,它需要接受指向成员函数的指针作为参数。我当然可以简单地单独使用 auto
,编译器将推断出正确的类型。但是,在可能的情况下,我更喜欢在适当的地方用 *
、&
和 const
修饰我的自动参数,从而更好地传达推导类型的性质和意图。如果我简单地将 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
-子句来执行此操作:
#include <type_traits>
auto l = [](auto pmf) requires std::is_member_function_pointer_v<decltype(pmf)>
{
S s;
(s.*pmf)();
};