2010-08-30 163 views
2

我必須將函數傳遞到指針。爲此,我使用boost :: function。捕獲指針的函數對於不同的簽名來說是過載的。例如:指針功能

void Foo(boost::function<int()>) { ... } 
void Foo(boost::function<float()>) { ... } 
void Foo(boost::function<double()>) { ... } 

現在我想通過一些類方法的指針有:

class test 
{ 
    public: 
     float toCall() { }; 
}; 

class Wrapper 
{ 
    Wrapper() { 
    test obj; 
    Foo(boost::bind(&test::toCall, this)); 
    } 
}; 


error: no matching function for call to ‘Foo(boost::_bi::bind_t<float, boost::_mfi::mf0<float, test>, boost::_bi::list1<boost::_bi::value<Wrapper*> > >)’ 
    note: candidates are: Foo(boost::function<float()>&) 

回答

6

Nonono這不能工作。因爲boost::function<...>有一個模板化的構造函數來接受任何和所有類型。稍後將檢查與呼叫簽名的兼容性。重載解析無法解決此問題。

此外,我想你想通過&obj而不是this。嘗試顯式轉換:

Foo(boost::function<float()>(boost::bind(&test::toCall, &obj))); 

這是完全醜陋的,但這樣你可能想引入一個typedef

void Foo(FloatHandler) { ... } 
... 
FloatHandler f(boost::bind(&test::toCall, &obj)); 
Foo(f); 

還是少不了你可以做Foo接受隨便什麼可調用類型T的模板。我懷疑這可能是最簡單的,因爲在一般情況下,我懷疑你不知道你需要投什麼boost::function<...>。而那些想要返回std::complex<>的人呢?所以...

template<typename T> 
void Foo(T) { ... } 
... 
Foo(boost::bind(&test::toCall, &obj)); 

希望這會有所幫助。

1

boost::bind不返回boost::function對象。它返回一個未指定的對象類型,它可以用作具有相應參數個數的函子。

雖然boost::function可以根據boost::bind的結果進行轉換構造,但是對於C++來說,在這種情況下重載分辨率「太複雜」。 (刪除了我的壞例子,但沒有真正說明正確的問題)。

+0

對於助推功能,場景甚至比這更邪惡。它就像'template struct A {template A(U); };'現在,* *看起來不能解決我的問題xD請注意,如果只有一個函數,你可以轉換。難點是*比較*兩個這樣的轉換序列。在boost :: function的情況下,這是完全不可能的,在你的情況下,它可能是可能的,但它對於over-res來說太複雜了。 – 2010-08-30 23:42:50

+0

@Johannes Schaub:你說得對。我的例子說明了一個完全不同的問題:歧義而不是「不可解決」:) – AnT 2010-08-30 23:47:36

2

在線路

Foo(boost::bind(&test::toCall, this)); 

thisWrapper類型。但綁定無法在其上找到toCall方法。

這裏有一個固定的後續版本(完整的,彙編了G ++ 4.3.2),這可能是你想要做什麼:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 

void Foo(boost::function<int()>) {} 
void Foo(boost::function<float()>) {} 
void Foo(boost::function<double()>) {} 

struct test { 
    float toCall() {return 0.0f;} 
}; 

int main(int,char**) { 
    test obj; 
    boost::function<float()> tgt=boost::bind(&test::toCall,obj); 
    Foo(tgt); 
    return 0; 
} 

由於AndreyT的回答指出,綁定的返回類型。 ..有點奇怪,因此顯式強制適當的函數類型。