2017-05-11 2 views
2

어떻게 아래 코드를 단순화 할 수 있습니까? 여기에 튜플을 사용할 수 있습니까? 그렇다면 어떻게 설명 할 수 있습니까? 템플릿 구현에서std :: function을 매개 변수로 사용하는 변형 템플릿

template<typename Out, typename T1, typename T2, typename T3, typename T4> 
void ProcessIncomingCommand(PClientContext pClientContext, 
    DWORD & bytesProcessed, 
    const std::function<Out(T1, T2, T3, T4)> &function, 
    const std::vector<UINT> &params); 

template<typename Out, typename T1, typename T2, typename T3> 
static void ProcessIncomingCommand(PClientContext pClientContext, 
    DWORD & bytesProcessed, 
    const std::function<Out(T1, T2, T3)> &function, 
    const std::vector<UINT> &params); 

template<typename Out, typename T1, typename T2> 
static void ProcessIncomingCommand(PClientContext pClientContext, 
    DWORD & bytesProcessed, 
    const std::function<Out(T1, T2)> &function, 
    const std::vector<UINT> &params); 

UINTstd::vector 통과 매개 변수 함수를 호출 할 필요가있다. 매개 변수가 다를 수 있으므로 적절한 유형으로 변환해야합니다.

auto resFromFunction= function(params.at(0), 
    params.at(1), 
    static_cast<T3>(params.at(2)), 
    static_cast<T4>(params.at(3))); 

log0 대답은 어떻게 사용할 수 있습니까?

template<typename Out, typename... T>static void ProcessIncomingCommand(PClientContext pClientContext, 
DWORD & bytesProcessed, 
const std::function<Out(T...)> &function, 
const std::vector<UINT> &params) 
+4

뭔가를 원하는 것 같습니다? 이 코드의 목적은 무엇입니까? – InternetAussie

+0

튜플은 무엇에 익숙합니까? – log0

+0

실현에서 나는 매개 변수 UINT의 벡터에 의해 전달 된 함수를 호출합니다. 벡터의 유형은 템플릿 args (T ...)와 다를 수 있습니다. 나는 그들을 적절한 유형으로 캐스팅해야합니다. 예 : function (static_cast (params.at (0)), ...) 등이 여기에 템플릿을 사용하는 적절한 방법입니까? –

답변

2

잘 모르겠지만 기능 도우미가 필요하고 std::index_sequence (또는 비슷한 것)이라고 가정합니다.

가능한 예와 std::make_index_sequence()std::index_sequence는 C++ 14 개 기능 있음

template <typename Out, typename ... Ts, std::size_t ... Is> 
static Out PIC_helper (
    PClientContext pClientContext, 
    DWORD & bytesProcessed, 
    const std::function<Out(Ts...)> &function, 
    const std::vector<UINT> &params, 
    std::index_sequence<Is...> const &) 
{ return function(static_cast<Ts>(params.at(Is))...); } 

template <typename Out, typename ... Ts> 
static void ProcessIncomingCommand (
    PClientContext pClientContext, 
    DWORD & bytesProcessed, 
    const std::function<Out(Ts...)> &function, 
    const std::vector<UINT> &params) 
{ 
    Out resFromFunction 
     = PIC_helper(pClientContext, bytesProcessed, function, params, 
        std::make_index_sequence<sizeof...(Ts)>()); 

    // other ... 
} 

Observere; C++ 11 솔루션이 필요하면 쉽게 대체 할 수있는 무언가를 만들 수 있습니다.

+0

솔루션을 구현하고 테스트 해보려고합니다. 답변 주셔서 감사합니다. –

+0

반환 유형의 템플릿을 고칠 수 있습니까? –

+0

@SmitYcyken - 미안하지만 이해가 안됩니다. – max66

0

이 컴파일됩니다.

template<typename Out, typename... T> 
static void ProcessIncomingCommand(PClientContext pClientContext, 
    DWORD & bytesProcessed, 
    const std::function<Out(T...)> &function, 
    const T&... params) { function(params...); } 

int main() 
{ 
    PClientContext p; 
    DWORD d = 0.5; 
    std::function<int(double, int, char)> f; 
    double a; 
    int b; 
    char c; 
    ProcessIncomingCommand(p, d, f, a, b, c); 
} 

당신이 튜플로 PARAMS을 전달하려는 경우

, 난이도가 될 것입니다 ... 대신 매개 변수 목록의 튜플을 위해 function을 변경하면 당연히 제외 How do I expand a tuple into variadic template function's arguments? 를 참조

+0

N 매개 변수로 함수를 호출하려면 어떻게해야합니까? 템플릿 구현에 대한 정보는 위의 주석을 참조하십시오. –

+1

알았어. 매개 변수가'function'으로 넘어 간다는 것이 확실하지 않았다. 방금 대답을 편집했습니다. – log0

+0

오해의 소지가있는 부분을 용서하십시오. –

0

당신이 * 정말 * 여기서 뭘하려고 무엇

template<typename ResultType, std::size_t... I> 
ResultType tuple_from_vector_impl(std::vector<UINT> params, std::index_sequence<I...>) 
{ 
    return std::make_tuple(static_cast<decltype(std::get<I>(std::declval<ResultType>()))>(params[I])...); 
} 

template<typename... Args, typename Indices = std::index_sequence_for<Args...>> 
std::tuple<Args...> tuple_from_vector(std::vector<UINT> params) 
{ 
    return tuple_from_vector_impl<std::tuple<Args...>>(params, Indices{}); 
} 

template<typename Out, typename ... Args> 
void ProcessIncomingCommand(PClientContext pClientContext, 
          DWORD & bytesProcessed, 
          const std::function<Out(Args...)> &function, 
          const std::vector<UINT> &params) 
{ 
    // preamble 
    std::tuple<Args...> args = tuple_from_vector<Args...>(params); 
    Out result = std::apply(function, args); 
    // postamble 
} 

template<typename ... Args> 
void ProcessIncomingCommand(PClientContext pClientContext, 
          DWORD & bytesProcessed, 
          const std::function<void(Args...)> &function, 
          const std::vector<UINT> &params) 
{ 
    // preamble 
    std::tuple<Args...> args = tuple_from_vector<Args...>(params); 
    std::apply(function, args); 
    // postamble 
} 
관련 문제