2015-04-26 94 views
0

我將指向成員函數的指針傳遞給模板函數。事情是這樣的,調用傳遞給函數的成員函數的指針

Foo bar; /* bar.baz(...) is a function */ 
    auto pnt = bar.baz; 

    passMmbFunc<...,decltype(pnt)>(...,pnt); 

passMmbFunc這個樣子的相關部分,

template <..., typename D> 
    void map(..., D func) { 
    ... 
    auto ret = func(someVal); 
    ... 
    } 

我認爲調用一個指向成員函數的語法是一樣的一個普通函數指針,但不是這樣。我得到以下錯誤,

error: must use '.*' or '->*' to call pointer-to-member function in 'func (...)', e.g. '(... ->* func) (...)' 

passMmbFunc內,我將如何調用pnt?我知道如果你有一個相應類的對象,可以調用一個指向成員函數的指針。但是由於我將它作爲參數傳遞,情況並非如此。那麼,如果你只有一個指針而沒有對象,那麼有沒有辦法調用一個指向成員函數的指針呢?

+0

你做了一個錯誤的假設。 – dtech

+0

語法讓你感到沮喪,因爲(如前面的評論建議)你假設太多了。您不能在沒有對象的情況下調用指向非靜態成員函數的指針,並且語法可以確保這一點。 – PaulMcKenzie

+0

什麼會調用成員函數,如'size()'或'to_string()'或其他什麼含義沒有相關類的實例? – Mat

回答

1

必須在對象上調用指向成員函數的指針 - 它不能用作獨立函數。因此你的錯誤。 baz必須用一些Foo使用無論是.*->*語法調用:

auto ptr_to_mem = &Foo::baz; 
Foo f, *pf; 

ptr_to_mem();  // error 
(f.*ptr_to_mem)(); // ok 
(pf->*ptr_to_mem()); // ok 

在C做的方式++是綁定指針到成員有一個對象,你會調用它。該標準甚至還提供了功能來做到這一點:std::bind:混亂的

auto pnt = std::bind(&Foo::baz, bar); 
pnt(); // this is the equivalent of bar.baz(); 

一個可能的來源是auto pnt = bar.baz;會怎麼做你想要什麼的Python。只是不在C++中。

+0

您的意思是'在C++中執行此操作的方式(11)' – texasbruce

+0

現在我想說C++ 11已經老了,並且已經足夠支持被認爲是隱含的了。 – dtech

+0

我不認爲C++ 11被大多數編譯器「隱式」啓用,因爲你總是必須通過'std = C++ 11' – texasbruce