2013-01-09 97 views
2

由於我無法正確地設計我的課我達到一個地步,我需要的是這樣的:對未初始化的對象使用std :: bind是否安全?

struct A 
{ 
    A(function< void(string&) cb >): callback(cb) {} 
    function< void(string&) > callback; 

    template <std::size_t T> 
    void func(string& str) { ... } 
} 

int main(){ 
vector<A> items = { 
    A(bind(&A::func<1>, items[0], _1)), 
    A(bind(&A::func<2>, items[1], _1)), 
    ... 
} 

這是安全使用?如果沒有,是否有其他選擇?

+1

那麼......你試圖解決什麼問題,這是你的解決方案? – GManNickG

+1

您已經發現的主要問題:*無法正確設計*。你需要努力,而不是解決方案。正如@GManNickG已經提到的那樣,如果您提供了您正在嘗試解決的**問題**,那麼您可能會得到提供更好設計的答案。做這項工作有不同的方法,但這不會使設計更好。 –

回答

6

這當然不安全。將在items初始化之前對items[0]進行評估。

在這裏做正確的事情可能是隻使用lambda,像

vector<A> items = { 
    A([&items](string& s){ items[0].func(s); }), 
    A([&items](string& s){ items[1].func(s); }), 
    ... 
} 

這隻抓起初始化期間items參考,然後翻出items[0]只有當回調實際上是調用。

或者,您是否可以更改回調以A&作爲參數?如果您的回撥類型是std::function<void(A&, string&)>,那麼您可以通過&A::func<1>作爲回調,它將起作用。

5

您正在使用[]運算符在構建之前訪問vector。這不安全。

我想你將不得不在vector中創建未完全初始化的項目,然後再設置bindee。

0

main中的代碼創建一個固定大小的向量。如果這是實際上是需要什麼,使用數組或std::array,並通過元素的地址bind電話:

A items[] = { 
    A(bind(&A::func<1>, &items[0], _1)), 
    A(bind(&A::func<2>, &items[1], _1)), 
    ... 
}; 

通過bind返回的函數對象知道如何將指針到對象綁定和一個成員函數。