2013-03-27 21 views
4

我試圖使用std ::轉換與std :: bind來簡化循環。這裏有一些代碼:如何使用通過引用傳遞的抽象類使用綁定

class ITest 
{ 
public: 
    virtual CPrueba Prueba(double p, double d = 0)const = 0; 
}; 

void foo(const ITest& test) 
{ 
    std::vector<double> v; 
    std::vector<CPrueba> vRes; 
    // ... 
    // ... 
    std::transform(v.begin(), v.end(), back_inserter(vRes), 
        bind(&ITest::Prueba, test, _1, 0)); 
    //... 
} 

這不會編譯。

我使用VS2008 SP1,並且我收到了很多模板錯誤,我不明白,所以I've tried in ideone(gcc 4.7.2)。在那裏我有一些更可讀的錯誤,我已經斷定它必須處理ITest被抽象化。

但我試過改變我如何通過測試對象,如果我這樣做by pointer, it works

那麼有什麼我可以用來保持函數簽名,仍然使用轉換綁定,而不是循環?

回答

4

std::bind內部存儲每個參數的ed類型std::decay。當通過test時,這導致它嘗試存儲ITest類型的對象,這當然是抽象的。

如果你通過test包裹在一個std::reference_wrapper,因爲這會導致std::bind存儲左值參考對象它將工作:

std::transform(v.begin(), v.end(), back_inserter(vRes), 
       bind(&ITest::Prueba, std::ref(test), _1, 0)); 

您可以將指針或者傳遞給對象,std::bind接受這個太:

std::transform(v.begin(), v.end(), back_inserter(vRes), 
       bind(&ITest::Prueba, &test, _1, 0)); 
+0

謝謝!不過,我的編譯器似乎並不喜歡ref版本。 – MikMik 2013-03-27 10:52:57