2011-04-13 7 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 λ 형식을 사용할 때 사용할 형식은 무엇입니까? 코드가 독점적으로 반복자를 기대 나타나는 그러나, 아마 허용템플릿과 람다 문제 C++ 0x

+0

무엇이 오류입니까? 그것은 여기에 잘 실행 중입니다 : http://ideone.com/zI3iL – Naveen

+0

그 오류가 없습니다, 그냥 템플릿과 함께 람다를 사용하여 궁금해하는 경우, 람다에게 템플릿의 유형을 알려주는 유일한 방법은 올바른 것입니다 코드하는 방법? – hidayat

답변

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가 그랬던 것처럼 훨씬 좋아한다. –

+0

@AndresJaanTack : 공정한 성명서 -이 질문에 처음 대답 한 이래로 1 년 반이 지나면 C++ 11 관용구에 대한 내 수준의 진화가이 시점에서 OP의 접근법을 사용할 수있을 정도로 충분히 발전했습니다. : - 그 말은, 나는 프록시 객체를 반환하는 반복자 (예 :'std :: vector :: iterator')와 관련하여 OP의 접근 방식에 대해 여전히 우려를 가지고 있지만, 잘 설립 된. – ildjarn