2014-01-25 2 views
0

가변 형식을 포함하는 구조체를 추출하여 추출한 다음 을 기본 함수 호출에 전달합니다.유효한 템플릿 확장?

//ValueArray contains a vector of a variant type. 

// Pulls out an argument from a ValueArray. 
template<typename Arg> 
inline Arg 
_processParam(ValueArray& args) { 
    Arg arg = static_cast<Arg&>(args[ 0 ]); 
    args.erase(0, true); 
    return arg; 
} 


/// Do the Function call. Args is a variadic template pack. 
call(fnPtr, _processParam<Args>(args)...); 

/// The call expands to: 
(*fnPtr)(params...); 

그러나 문제는 _processParam (args) ... 확장이 역순으로 args를 유형별로 철회하는 것입니다. 예를 들어 [1, 1.4]의 ValueArray는 double, then 및 int로 추출됩니다. 인수를 올바르게 그리고 이식 할 수있는 방법이 있습니까?

+0

평가를 함수 호출의 표현식 (쉼표 연산자가 아닌','로 분리됨)은 * 정렬되지 않은 *입니다. g ++와 같은 일부 컴파일러의 경우 순서는 오른쪽에서 왼쪽입니다. 즉, 가장 오른쪽 인수 표현식이 먼저 평가됩니다. 프로그램에 정의되지 않은 동작이있는 것으로 보입니다. – dyp

+0

대부분의 컴파일러는 오른쪽에서 왼쪽 또는 왼쪽에서 오른쪽으로 평가됩니까? 그렇다면 지금은 그 사건들을 처리 할 수 ​​있습니다. 그렇지 않으면 함수 호출에 인덱스를 첨부 할 수 있습니까? – h4tch

답변

1

erase을 제거하고 색인을 추가하십시오. 함수 호출을 할 때 다른 매개 변수 계산에 사용 된 데이터를 변경하지 마십시오. 순서는 정의되지 않습니다 (컴파일러가 효율성을 위해 순서를 변경할 수 있도록하거나 miin의 단계).

쉽게이 작업을 수행하는 간접적 인 수준을 추가해야합니다

ProcessParam 지금처럼 배열을 요소를하지 소요되며, 사용
template<unsigned...>struct indexes {}; 

template<unsigned num, unsigned... Is>struct make_indexes: 
    make_indexes<num-1, num-1, Is...>{}; 
template<unsigned...Is>struct make_indexes<0,Is...>:indexes<Is...>{}; 

template<typename... Args, unsigned...Is> 
void do_call(indexes<Is...>, ValArray& arr){ 
    call(fnPtr, ProcessParam<Args>(arr[Is])...); 
} 

: 인수의

do_call<Args...>(make_indexes<sizeof...(Args)>(), arr); 
+0

이것은 전화 답변이 아닙니다 : typoh를 가질 수도 있습니다 – Yakk

+0

감사합니다. 색인을 얻는 방법을 알 수 없었습니다. 이것은 일종의 우편 작동처럼 보입니다. – h4tch

+0

@ DanH. 대답이 향상되었습니다. 같은 크기의 인덱스 팩을 만든 다음 parrallel로 확장합니다. C++ 1y는 위의 보일러 플레이트의 대부분을 수행하는'index_sequence'를 가질 것입니다. – Yakk

관련 문제