호출

2016-10-18 4 views
2

의 입력/출력 형태를 취득 나는 다음과 같은 문제가있다 : 당신이 위의 볼 수 있듯이호출

template<typename Func, typename T_in = /*input type of Func */, typename T_out = /*output type of Func */> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
} 

, 내가 입력 벡터 input의 각 요소에 함수 f 매핑하는 기능 foo을 구현하려고합니다. 내 문제는 다음과 같습니다 : 입력 벡터 input의 요소가 입력 형식이 f (즉, T_in)이고 출력 벡터의 요소가 출력 형식이 f (예 : T_out)이되도록하고 입/foo (코드의 가독성 향상)으로 명시 적으로 f의 출력 유형입니다. 누구든지 입력/출력 유형 f을 컴파일 타임에 자동으로 추론 할 수있는 아이디어가 있습니까?

미리 감사드립니다.

답변

1

유형 T_ininput 벡터에서 추론 할 수있다.

나는 T_out의 공제는 C++ 14뿐만 아니라, C++ 11도 작동합니다 typename std::result_of<Func(T_in)>::type 대신 std::result_of_t<Func(T_in)>의 사용 std::result_of_t

template <typename Func, typename T_in, 
      typename T_out = std::result_of_t<Func(T_in)>> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 

위한 일이라고 생각합니다.

0

기능 맵을 사용하면 실제로 매우 일반적인 디자인 패턴은 C++입니다. 나는 이것을 위해 std :: Map 컨테이너를 사용하도록 권장한다. here is a link.

행운을 빕니다 :)

+0

감사합니다. 간략하게하기 위해 위의 게시물에서 간단한 예제를 사용했습니다. 불행히도 표준 라이브러리를 사용하여 실제 예제를 구현할 수 없습니다. –

2

decltypeautofoo의 반환 유형을 변경과 함께이 작동한다.

template<typename Func, typename T_in> 
auto foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<decltype(f(input[0]))> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
}