2012-07-05 48 views
2

這裏有很好的描述瞭如何通過指針調用成員函數: http://www.newty.de/fpt/functor.html是否有可能在C++中將指針類成員作爲單個參數傳遞?

但仿函數需要獲得2個參數:指針到對象,指針到成員函數:

TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)(const char*)) 
{ pt2Object = _pt2Object; fpt=_fpt; } 

撥打:

(*pt2Object.*fpt)(string); 

是否有可能通過一個參數,如C-風格:

func() -- call 
func -- function pointer 

爲什麼obj.method不是完整的指針類成員?

+0

您能否澄清一下聲明「爲什麼obj.method不是完整的指針類-會員?」這是什麼意思? – Naveen 2012-07-05 09:04:20

+0

'(* pt2Object。* fpt)(string);'不起作用。你需要'(pt2Object - > * fpt)(string);'。 – Potatoswatter 2012-07-05 09:06:28

+0

Naveen,我想獲得指向特定對象(obj)和特定類成員(成員)的單個參數。但似乎我開始明白......多態性並沒有給我潛力做我想做的事。 – legotron 2012-07-05 09:11:23

回答

7

語法object.*ptmf不創建一箇中間對象。它沒有意義,並被語言禁止。你立即調用訪問成員函數指針的結果。

您可以使用std::bind明確地創建這樣一個對象,該對象將ptmf解釋爲函子對象,並使隱式this參數顯式化。

auto fn = std::bind(ptmf, object, std::placeholders::_1); 
std::function< void(const char *) > stdfn = fn; 
fn("foo"); // equivalent to object.*ptmf("foo"); 

http://ideone.com/ds24F

注意,此功能是在C++ 11新。儘管C++ 03 TR1具有functionbind,但它們不會在ptmf上執行此轉換。 (Plain C++ 03可以使用std::mem_fnstd::bind1st來完成這項工作,但它們使用起來非常痛苦並且已被棄用。)

+0

如果我正確地理解了這個問題,他想通過作爲參數的函數,因此您需要指定類型 - 不使用已更新的auto – 2012-07-05 09:20:09

+0

@BЈовић; v)。請注意,沒有辦法明確指定'std :: bind'的返回類型,'std :: function'可能會添加一個間接調用,所以'auto'是最好的選擇,除非您需要將它存儲在本地範圍之外或傳遞給非模板函數。 – Potatoswatter 2012-07-05 09:20:30

+0

@SteveJessop同樣,已經更新:)只是刷新頁面 – Potatoswatter 2012-07-05 09:33:39

1

是否有可能將指針類成員作爲C++中的單個參數傳遞?

不,這是不可能的。你需要你想調用該方法的類的對象。

你可以去解決這個使用lambda functions,就像下面的例子:

#include <iostream> 
#include <functional> 

void call(const std::function< void(const char * a) > & fn) 
{ 
    fn("hi"); 
} 

void foo(const char * a) 
{ 
    std::cout << "foo : " << a << std::endl; 
} 

class bar 
{ 
public: 
    void operator()(const char * a) 
    { 
    std::cout << "bar : " << a << std::endl; 
    } 
}; 

int main() 
{ 
    bar b; 
    const auto f1 = [&](const char * a){ b(a); }; 

    const auto f2 = foo; 

    call(f1); 
    call(f2); 
} 
1

問自己是否可以調用成員方法,而無需指定的對象。 考慮一下:

class A { 
public: void m() {} 
}; 
int main() { 
    m(); // can't call without object - like: A a; a.m(); 
} 
+0

我寫了錯誤的評論,並刪除它,對不起。 A.m是精神錯亂:)如果你創建一個對象,一個obj,爲什麼obj.m不是一個正確的指向成員的指針? – legotron 2012-07-05 09:27:37

+0

@legotron對於A類中的每個對象,派生的A :: m()只被定義一次。它相當於「C」函數'A_m(A * const this)'。類似的問題:有函數'int f(int i);'你會期望有有效地址給'&f(1)'?你只能把'pf =&f'作爲'(* pf)(1)'使用它 - 你不能說'pf = &f(1);(* pf)()' – PiotrNycz 2012-07-05 12:02:59

相關問題