C++ 11

2016-06-29 9 views
1

내가 아래 프로그램을 시도했다 실패 C++ 11

#include<type_traits> 
using namespace std; 
template <class F, class R = typename result_of<F()>::type> 
R call(F& f) { return f(); } 
int answer() { return 42; } 

int main() 
{ 
    call(answer); 
    return 0; 
} 

는 "호출 (답변)"실패

이 컴파일을

VC 말한다 'R 호출 (F &)' 'R'에 대한 템플릿 인수를 추론 할 수없는

GCC는 말한다 | 주 : 템플릿 인수 공제/대체 실패 : | 오류 : 함수가 나는 "쿵푸가 있는지 확실하지 않습니다 함수

를 반환 nction name "을 템플릿에 사용할 수 있습니다. 어디서 잘못 되었습니까? 내 전화 (답변)를 작동시키는 방법은 무엇입니까?

답변

1

당신은 이러한 경우에 전달 참조를 사용할 수 있습니다

#include<type_traits> 
#include<utility> 
#include<cassert> 

using namespace std; 

template <class F, class R = typename result_of<F()>::type> 
R call(F&& f) { return std::forward<F>(f)(); } 

int answer() { return 42; } 

int main() 
{ 
    assert(call(answer) == 42); 
    return 0; 
} 

그것은 일반적으로 문제를 피할 수 있습니다.

그렇다면 왜 코드가 제대로 작동하지 않는지는 @ T.C에 의해 잘 설명됩니다. 그의 대답에.
자세한 내용은이 질문에 대한 의견을 참조하십시오.

+0

그러나 lvalue로 f를 호출 할 수없는 이유는 무엇입니까? 함수 이름은 항상"lvalue "가 아니므로 – Troskyvs

+0

당신의 예제에서, 템플릿 타입 공제가 작동하기 때문에,'F'는 참조가 아닌 함수 타입입니다. 전달 참조를 사용하면'F'는'answer'에 대한 참조로 추론됩니다. static_assert (예 : is_reference :: value, "!");'나의 예제와 @ TC의 것 ' – skypjack

+0

또 다른 테스트는'call 내에'std :: function func;를 추가하는 것이다. '두 예제 모두에서. 이것은'F'에 대한 유형 공제와 함께 여러분이 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다. – skypjack

0

두 번째 템플릿 인수를 피하고 autodecltype()의 조합을 사용할 수 있다고 가정합니다. (이 경우) C++ (14)을 사용할 수 있습니다

뭔가

#include<type_traits> 

using namespace std; 

template <class F> 
auto call(F& f) -> decltype(f()) 
{ return f(); } 

int answer() 
{ return 42; } 

int main() 
{ 
    call(answer); 

    return 0; 
} 

처럼 당신은, 당신은 단순히 auto

template <class F> 
auto call(F& f) 
{ return f(); } 

p.s : 내 나쁜 영어 죄송를 사용 할 수 있습니다.

+0

이 두 가지 버전은 다른 작업을 수행합니다. –

+0

두 버전이 다른 이유는 무엇입니까? – Troskyvs

+0

@ T.C. -'auto'는'decltype (f())'가 보존 할 const와 참조를 풀 수 있다는 것을 의미합니까? 그래서 그것은 C++ 14에서'auto' 대신'decltype (auto)'이어야합니까? – max66

1

당신은 너무, 좌변으로 f를 호출 :

template <class F, class R = typename result_of<F&()>::type> 
//            ^
R call(F& f) { return f(); } 
+0

나는이 "result_of :: type을 얻지 못한다. 여기에 F &()는 무엇을 의미합니까? – Troskyvs