2011-10-01 2 views
11

방금 ​​보았습니다 this really nice talkRock Hard : C++ 진화 Boris Jabes 저. 고차원 일반 프로그래밍에 관한 이야기의 섹션에서 그는 다음은 반환 형식에 관해서 더 일반적인하는 함수의 예이며, 적은 템플릿 함수로 연결C++ 11의 사용법 decltype

template <typename Func> 
auto deduce(const Func & f) -> decltype(f()) 
{..} 

이 과부하 말한다 그러나

template <typename Func> 
Func deduce(const Func & f) 
{..} 

그래서 난 정말decltype의 독특한 능력을 표시하지 않습니다 선택한 예를 추측 다음과 같이 일반 템플릿 구문을 사용하여 실현 될 수있다. 누구든지 그러한 더 많은 예제를 줄 수 사용법 decltype? 컨테이너 C의 VALUE_TYPE을 Autodeducting

+7

제 첫번째 예는''는 (F)'''Func'''의 결과의 유형을 리턴 추론 것을 의미한다. 두 번째 예제는'''' (f)''''''Func'''를 반환한다는 것을 의미합니다. 그 차이가 보이니? –

+0

아아, 죄송합니다.'decltype'의 인수 안에 여분의'()'가 없습니다. 내 실수. –

답변

25

귀하의 의혹이 잘못되었습니다.

void f() { } 

지금 deduce(&f)void을 입력있다, 그러나 당신의 재 작성으로, 그것은 void(*)()을 입력있다. 어떤 경우 든 표현식 또는 선언의 유형을 얻으려는 경우 decltype을 사용합니다 (이 두 가지 사이의 미묘한 차이점은 decltype(x)은 반드시 decltype((x))과 같지 않음). 예를 들어

, 그것은 가능성이 표준 라이브러리 구현 어딘가에 ++ 과거 C 전반에 걸쳐 어려운 문제가있다 add의 올바른 반환 형식을 찾기

using size_t = decltype(sizeof(0)); 
using ptrdiff_t = decltype((int*)0 - (int*)0); 
using nullptr_t = decltype(nullptr); 

같은 줄이 포함되어 있습니다. 이것은 이제 쉬운 운동입니다.

template<typename A, typename B> 
auto add(A const& a, B const& b) -> decltype(a + b) { return a + b; } 

작은 알려진 당신이 :: 전에 의사 소멸자의 이름을 내가 사용

// has no effect 
(0).~decltype(0)(); 

// it and ite will be iterators into an initializer list 
auto x = { 1, 2, 3 }; 
decltype(x)::iterator it = x.begin(), ite = x.end(); 
+1

조금 설명해 주시겠습니까 :'(0). ~ decltype (0)();'? 나는 그것을 얻지 못할까 봐 걱정된다. –

1
std::for_each(c.begin(), c.end(), [](decltype (c.front()) val){val*=2;}); 

decltype없이 할 수 없습니다.

+1

다형성이 아니기 때문에 lambda를 사용하는 경우에만 수행 할 수 있습니다 (아직 C++에 있기를 희망합니다). 다형 함수 객체를 사용했다면 자동으로 추론됩니다. –

0

한 곳에서 decltype를 사용할 수 있다는 것입니다, 나는 같은 유형이 있어야합니다 변수를 만들 필요가있는 곳입니다 다른 변수의. 그러나 미래에 유형이 동일하게 유지 될지 확실하지 않습니다.

void foo(int a)//maybe in future type of a changed 
{ 
    decltype(a) b; 
    //do something with b 
}