![](/img/trans.png)
[英]Using std::function/mem_fn in C++11 with member functions
[英]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
與類類型T
為RT::*
以提供成員函數類型。 這還允許將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.