簡體   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