我有一个泛型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);
}发布于 2022-02-03 15:10:22
你可以宣布它为:
auto l = [](auto S::*pmf)它确实将指针绑定到S类型,但这是有意义的,因为您将以这种方式使用它。
发布于 2022-02-03 15:15:16
在C++20中,您可以使用一个概念来约束它:
#include <type_traits>
template <typename T>
concept MemberPointer = std::is_member_pointer_v<T>;
void test() {
auto foo = [](MemberPointer auto memPtr) {};
}发布于 2022-02-03 15:16:29
您可以使用C++20 requires-clause来完成以下操作:
#include <type_traits>
auto l = [](auto pmf) requires std::is_member_function_pointer_v<decltype(pmf)>
{
S s;
(s.*pmf)();
};https://stackoverflow.com/questions/70973619
复制相似问题