2016-12-31 2 views
9

나는 함수가 어딘가 알고 값을 반환하고 매개 변수를 알고있다 x라고 있습니다템플릿에서 사용할 함수의 반환 유형을 검색하려면 어떻게해야합니까?

int x(int y); 

내가 다른 곳이, 나는이 기능의 n 호출을 포함하는 컨테이너를 만들려고합니다. 그런 다음 여러 번 실행하고 싶습니다.

문제는 반환 유형이 int 인 것에 의존하고 싶지 않다는 것입니다. 나는 컴파일 타임에 리턴 타입을 추론 할 필요가있다. 뭔가 같은 :

std::vector<result_of<x(int)>::type> results; 

그러나 나는 정적이기 때문에 매개 변수 값을 지정하지 않으려는.

+0

[이 StackOverflow 질문] (http://stackoverflow.com/questions/11310898/how-do-i-get-the-type-of-a-variable) 귀하의 질문에 대한 답변을 수도 있습니다. – Nietvoordekat

+0

당신은 해결책을 여기서 볼 수 있습니다 : http://stackoverflow.com/a/41301717/2378300 – Jonas

답변

6

당신은 당신의 자신의 특성을 만들 수 있습니다, 뭔가 같은 :

template <typename F> struct my_result_of; 

template <typename F> struct my_result_of<F*> : my_result_of<F> {}; 

template <typename Ret, typename ... Ts> 
struct my_result_of<Ret(Ts...)> 
{ 
    using type = Ret; 
}; 

template <typename F> using my_result_of_t = typename my_result_of<F>::type; 

그리고 (더 x의 오버로드가 없다고 가정)처럼 사용 : 난 당신이 가장 최근까지 사용할 수 있습니다 가정

std::vector<my_result_of_t<decltype(x)>::type> results; 
5

가까이 있습니다. 호출자 함수의 템플릿 인수는 T입니다 가정 :

std::vector<decltype(x(std::declval<T>()))> results; 
+1

[이 작동하지 않습니다.] (http://coliru.stacked-crooked.com/a/755fc639873ce270) 않았다 당신은 당신의 솔루션을 테스트합니까? – cpplearner

+1

@cpplearner : 귀하의 요점. 그것은 result_of가 작동하는 방식이 아닙니다. 'decltype'으로 변경되었습니다. – erenon

+0

"호출자 함수의 템플릿 인수"? 'x'를 호출하고자하는 함수는 템플릿 인자를 가지고 있지 않습니다. – NeomerArcana

2

당신은 std::function::result_type을 남용 할 수 x 정말 기능의 경우

int x(int y); 
static_assert(std::is_same_v<int,std::function<decltype(x)>::result_type>); 

은 물론이 경우에만 작동합니다. x이 임의 함수 객체 인 경우 결과 유형은 인수 유형에 따라 달라질 수 있습니다.이 경우 인수를 지정하지 않고 결과 유형을 알 수 없습니다.

2

을 표준 리비전을 지정하지 않았습니다. 함수의

#include<vector> 
#include<functional> 
#include<utility> 

template<std::size_t... I, typename F, typename... A> 
auto gen(std::index_sequence<I...>, F &&f, A... args) { 
    return std::vector<decltype(std::forward<F>(f)(args...))>{ 
     (I, std::forward<F>(f)(args...))... 
    }; 
} 

template<std::size_t N, typename F, typename... A> 
auto gen(F &&f, A... args) { 
    return gen(std::make_index_sequence<N>{}, std::forward<F>(f), args...); 
} 

int f(int, char) { return 0; } 

int main() { 
    auto vec = gen<10>(&f, 0, 'c'); 
} 

반환 유형을 쉽게 추론된다 :

decltype(std::forward<F>(f)(args...)) 

내가 N이 함수의 호출을 포함하는 컨테이너를 만들려면 여기
는 최소한의 작업 예입니다. 그런 다음 여러 번 실행하고 싶습니다.

이렇게하려면 std::index_sequence을 사용하여 올바른 크기의 매개 변수 팩을 만드십시오.

(I, std::forward<F>(f)(args...))... 

기본 개념은 상술 한 파라미터 팩을 풀고 N 배 기능을 실행 콤마 연산자를 이용하는 것이다 : 그것은 다음
나서 벡터 자체가 초기화된다. invokations에 의해 반환 된 값은 f이며 벡터를 채우는 데 사용됩니다.

argsf으로 완벽하게 전달되지 않습니다.
처음 실행하는 동안 움직일 수있는 객체가 소비되는 경우 문제가 발생할 수 있습니다.

관련 문제