2011-04-13 91 views
2
#include <iostream> 
#include <algorithm> 
#include <array> 

using namespace std; 

template<class T> 
void func(T beg, T end) 
{ 
    typedef decltype(*beg) type; 
    std::for_each(beg, end, [](type t) { cout << t << endl; }); 
} 

int main() 
{ 
    std::array<int, 4> arr = { 1,2,3,4 }; 
    func(arr.begin(), arr.end()); 

    return 0; 
} 

decltype當告訴lambda表達式將使用什麼類型的路要走?問題與模板和lambda C++ 0x

+0

你得到的錯誤是什麼。它運行得很好:http://ideone.com/zI3iL – Naveen 2011-04-13 09:29:34

+0

它沒有錯誤,我只是想知道什麼時候使用帶模板的lambda,decltype是告訴lambda模板的唯一方法,是正確的代碼的方式? – hidayat 2011-04-13 09:31:42

回答

2

這可能接受,但是因爲你的代碼出現預期的迭代器完全,我認爲下面會更合適:

typedef typename std::iterator_traits<T>::value_type type; 

甚至更​​好(因爲你是如何使用它):

typedef typename std::add_reference< 
    typename std::add_const< 
     typename std::iterator_traits<T>::value_type 
    >::type 
>::type type; 
+0

我更喜歡OP做它的方式。 – 2012-11-07 01:22:50

+0

@AndresJaanTack:公平陳述 - 自從我最初回答這個問題以來的一年半時間裏,我對C++ 11習語的滿意程度已經得到了充分的發展,在這一點上我可能也會使用OP的方法。 : - ]儘管我不知道這些問題是否真的存在,但我仍然對OP的方法持懷疑態度,關於返回代理對象的迭代器(例如'std :: vector :: iterator')有理有據。 – ildjarn 2012-11-07 01:46:38