簡體   English   中英

具有重載成員函數的C ++ std :: mem_fn

[英]C++ std::mem_fn with overloaded member function

編譯以下代碼時,Visual Studio報告:

\main.cpp(21): error C2664: 'std::_Call_wrapper<std::_Callable_pmd<int ClassA::* const ,_Arg0,false>,false> std::mem_fn<void,ClassA>(int ClassA::* const )' : cannot convert argument 1 from 'overloaded-function' to 'int ClassA::* const '
    1>          with
    1>          [
    1>              _Arg0=ClassA
    1>          ]
    1>          Context does not allow for disambiguation of overloaded function

創建mem_fptr1時,為什么編譯器會感到困惑? 但是當我指定類型時, mem_fptr2一些方法mem_fptr2可以。

是否可以創建指向不帶參數的重載成員函數的成員函數指針?

class ClassA
{
public:
    void memberfunction()
    {
        std::cout <<"Invoking ClassA::memberfunction without argument" << std::endl;
    }

    void memberfunction(int arg)
    {
        std::cout << "Invoking ClassA::memberfunction with integer " << arg << std::endl;
    }
};

int main()
{
    auto mem_fptr1 = std::mem_fn<void, ClassA>(&ClassA::memberfunction);
    auto mem_fptr2 = std::mem_fn<void, ClassA, int>(&ClassA::memberfunction);

    mem_fptr1(ClassA());
    mem_fptr2(ClassA(), 3);
}

在C ++ 11中引入了帶有可變參量類型列表模板重載,但在C ++ 14中將其作為缺陷#2048刪除。 指定特定重載的方法是將一個函數類型指定為第一個模板參數(第二個模板參數,即類類型,可以省略,因為可以推導出):

auto mem_fptr1 = std::mem_fn<void()>(&ClassA::memberfunction);
auto mem_fptr2 = std::mem_fn<void(int)>(&ClassA::memberfunction);

然后,將函數類型R與類類型TRT::*以提供成員函數類型。 這還允許將std::mem_fn形成為數據成員(其中R是非函數類型)。

請注意,您的代碼(對於mem_fptr2 )在C ++ 14中不起作用,在C ++ 14中,模板重載采用了可變的參數類型列表; 上述代碼在兩種版本的標准中均適用。

另一種方法是執行成員函數強制轉換; 在這種情況下,您無需為mem_fn指定模板參數:

auto mem_fptr1 = std::mem_fn(
    static_cast<void (ClassA::*)()>(&ClassA::memberfunction));
auto mem_fptr2 = std::mem_fn(
    static_cast<void (ClassA::*)(int)>(&ClassA::memberfunction));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM