2011-07-26 2 views
9

나는 iterator 주위의 wrapper 인 templated 클래스를 만들고있다. 나는 운영자 * 이런 식으로 만드는 중이라서 :함수 반환을위한 Decltype

template <typename T> 
class MyIterator { 
public: 
    //... 
    decltype(*T()) operator*() { 
    //... 
    } 
} 

내가 클래스 T의 운영자 *에 decltype 호출을 줄을, 그것도 작동하지만, T 나던 기본 생성자 실 거예요 작업이있는 경우.

반환되는 함수/메서드 유형을 확인하려면 어떻게해야합니까? 구현이 std::declval은 (비주얼 C++ 2010를 포함하지 않습니다), 당신은 쉽게 스스로를 쓸 수 있습니다 제공하지 않는 경우

decltype(*std::declval<T>()) operator*() { /* ... */ } 

:이 std::declval가 무엇인지입니다

답변

16

template <typename T> 
typename std::add_rvalue_reference<T>::type declval(); // no definition required 

T이 반복기 유형이기 때문에 std::iterator_traits 템플릿을 사용할 수도 있습니다.이 템플릿에는 C++ 0x suppor가 필요하지 않습니다. t :

typename std::iterator_traits<T>::reference operator*() { /* ... */ } 
+0

제 컴파일러는 "declall()을 사용하면 안됩니다!"라고 말합니다. –

+1

컴파일러는 정확히 무엇을 사용합니까 (그리고 어떤 컴파일러를 사용합니까?) 정의되지 않았기 때문에 _ODR-use_'declval'을 사용할 수 없습니다. 평가되지 않는 컨텍스트에서만 "사용"할 수 있습니다. 'decltype'에서. –

+0

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../include/c++/4.6.1/type_traits:1134:7 : 오류 : 정적 어설 션 failed : "declval()을 사용하면 안됩니다!" –