Tengo una función lambda genérica que necesita aceptar una función de puntero a miembro como parámetro. Por supuesto, puedo simplemente usar auto solo y el compilador deducirá el tipo correcto. Sin embargo, siempre que sea posible, prefiero decorar mis parámetros automáticos con * , & y const cuando corresponda, comunicando así mejor la naturaleza y la intención del tipo deducido. Si simplemente convierto el parámetro auto en auto* , obtengo un error de compilación, lo que no me sorprende mucho, ya que auto* significa un puntero normal, no un puntero a miembro. ¿Existe alguna sintaxis para restringir un parámetro auto para que acepte un puntero a miembro, o debería simplemente usar auto y olvidarme de él?
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); }Puedes declararlo como:
auto l = [](auto S::*pmf) Vincula el puntero a un tipo S , pero tiene sentido porque es así como lo usará.
En C++20 puedes restringirlo con un concepto:
#include <type_traits> template <typename T> concept MemberPointer = std::is_member_pointer_v<T>; void test() { auto foo = [](MemberPointer auto memPtr) {}; }Puede usar C++ 20 requires -clause para hacer esto:
#include <type_traits> auto l = [](auto pmf) requires std::is_member_function_pointer_v<decltype(pmf)> { S s; (s.*pmf)(); };