2013-01-12 67 views
0

是否有模板在下面的lambda函數中的「ints」在有雙標或浮點等的標準容器的情況下?我已經向全世界尋求幫助。我甚至要求我的教授的幫助,他說這是可能的,但是對於答案是神祕的。在std :: accumulate C++中使用模板Lambda表達式?

template <typename T> 
    float mean(T &container) 
    { 
    auto sum = std::accumulate(container.begin(), container.end(), 0/*initial value*/, 
    [](int total, int cur) 
    { 
      return total+cur; 
    }//end of lambda 
    );//end of accumulate 
    return static_cast<float>(sum)/container.size(); //to find the mean 
}//end of mean 

在此先感謝。

+0

從第一句話中缺少詞語嗎? –

+0

是的,抱歉。有沒有[方法]模板化... – OakleyMaster

回答

1

通常有一種方法可以從容器中獲取所包含數據的類型。

例如,您可以用T::value_type替換該函數中的int,它應該支持所有顯示此類typedef的容器。

這不會適用於類型,如map,但如果你想支持它們,你可以專注於它。

+0

謝謝!我已經想通了一個方法,工作好。它只是強制函數調用看起來像這樣。 float initialValue = 0.0; mean(container,initialValue); 然後我添加了一個額外的模板值來捕獲initialValue的數據類型。 – OakleyMaster

-1

但在我看來,寫這樣一個函數,這樣可能引起數據 丟失例如

std::vector<float> vf; 
vf.push_back(1.3); 
vf.push_back(1.5); 
vf.push_back(1.3); 
vf.push_back(1.123); 
vf.push_back(1.526); 
float m=mean(vf); 

總是返回1

答案這裏>>>compute mean using std::accumulate fails在編輯部分是不是真的如果我改變vf.push_back(1.3);vf.push_back(3.3);我會得到希望的結果。