2013-01-15 32 views
1

std :: bind的返回類型是(有意)未指定的。它在std :: function中是可存儲的如何避免使用std :: bind()臨時對象顯式強制轉換?

下面的示例程序演示瞭如何將std :: bind()返回的臨時對象顯式轉換爲std :: function以調用fn1()。

如果std :: bind的返回類型是可知的,我可以重載回調構造函數&將不再需要顯式強制轉換std :: bind臨時對象。

有什麼辦法可以避免顯式轉換嗎?

// g++ -std=c++11 test.cxx 
#include <functional> 

using std::placeholders::_1; 

class A 
{ 
    public: 
     void funcA (int x) { } 
}; 

class Callback 
{ 
    public: 
     Callback() = default; 
     Callback (std::function<void(int)> f) { } 
     // Wish we knew the return type of std::bind() 
     // Callback (return_type_of_std_bind f) { } 
}; 

void fn0 (std::function<void(int)> f) { } 
void fn1 (Callback cb) { } 

int main (void) 
{ 
    A a; 
    fn0(std::bind(&A::funcA, &a, _1)); // ok 
    fn1(std::function<void(int)>(std::bind(&A::funcA, &a, _1))); // ok, but verbose 
    fn1(std::bind(&A::funcA, &a, _1)); // concise, but won't compile 
} 

可能不相關,但我在Linux上使用gcc 4.7.2。

+0

你會得到什麼編譯錯誤? –

+1

而不是試圖知道什麼是(設計)不應該知道,不問這個問題。不要試圖知道類型,寫一個不需要知道類型的構造函數......在這一點上你應該考慮「模板」。 –

回答

11

最好給Callback通用構造:

struct Callback 
{ 
    typedef std::function<void(int)> ftype; 
    ftype fn_; 

    template <typename T, 
       typename = typename std::enable_if<std::is_constructible<ftype, T>::value>::type> 
    Callback(T && f) : fn_(std::forward<T>(f)) 
    { } 
}; 

(我加了第二,拖欠模板參數只有啓用此構造函數類型T對於該說法是有道理的,以免產生錯誤兌換)注意這種技術如何通過調用明確的 con ­ struc ­ tor的fn_來移動一個來自轉換鏈的隱式用戶定義轉換。

+0

爲了說明這一點,如果他不希望它作爲成員變量,那麼也可以只有一個局部變量。 –

相關問題