2012-03-22 1 views
3

저는 인덱스가있는 SQL 테이블과 유사한 몇 가지 std :: vectors에 가변 arity 함수를 가져와야하는 기중 장치를 작성하고 있습니다. 모든 벡터에서 같은 id를 갖는 각 요소 집합에 f 매개 변수를 적용하고 싶습니다. 템플릿 공제에 문제가 있습니다. 여기에서 이터레이터 로직을 뺀 곳에서 추출한 것입니다. 필자는 합리적인 재귀 케이스라고 생각하지만 필기 템플릿 공제는 실현 가능하지 않다고 생각합니다.하나의 가변 템플릿 매개 변수를 새로 만들 때 사용할 수 있습니까?

// Simple container type 
template <typename T> 
struct A { 
    T x; 
    T y; 
    T z; 
}; 

// Wrapper type to differentiate an extracted value from a container 
// in template deduction 
template <typename T> 
struct B { 
    T value; 
}; 

// Base case. All A<Ts> have been extracted to B<Ts>. 
template <typename F, typename... Ts> 
void lift (F f, B<Ts> ...bs) { 
    // Call f with extracted values 
    f(bs.value...); 
} 

// Recursive case 
template <typename F, typename T, typename... Ts, typename Us> 
void lift (F f, A<T> a, A<Ts> ...as, B<Us> ...bs) { 
    // Copy a value from the beheaded container A<T>. 
    B<T> b = {a.x}; 
    // Append this B<T> to args and continue beheading A<Ts>. 
    lift(f, as..., bs..., b); 
} 

// Test function 
template <typename... Ts> 
struct Test { 
    void operator() (Ts...) {} 
}; 

int main() { 

    B<int> b = {1}; 
    // No errors for the base case 
    lift(Test<>()); 
    lift(Test<int, int>(), b, b); 

    // error: no matching function for call to 'lift' 
    // The notes refer to the recursive case 
    A<int> a = {1,0,0}; 
    lift(Test<int>(), a); // note: requires at least 3 arguments, but 2 were provided 
    lift(Test<int>(), a, a); // note: requires 2 arguments, but 3 were provided 
    lift(Test<int>(), a, a, b); // note: requires 2 arguments, but 4 were provided 
} 

이 코드의 잘못된 점은 무엇입니까?

모든 것을 무시하고 읽고 쓰기가 쉽습니다. 왜이 컴파일이 실 거예요?

+0

'as' 팩은 마지막 매개 변수 위치에 있지 않기 때문에 추론 할 수 없습니다. –

답변

1

단순히 A와 B의 값을 직접 추출하지 않는 이유는 무엇입니까?

template <typename T> 
T extractValue(A<T> a) 
{ 
    return a.x; 
} 
template <typename T> 
T extractValue(B<T> b) 
{ 
    return b.value; 
} 

template <typename F, typename... T> 
void lift (F f, T... values) { 
    f(extractValue(values)...); 
} 

또한 인수의 수가 잘못되어 마지막 2 개의 테스트 사례를 컴파일 할 수 없습니다.

lift(Test<int,int>(), a, a); 
lift(Test<int,int,int>(), a, a, b); 
+0

왜 인수의 수가 잘못 되었습니까? Variadic 템플릿 함수의 목적 일 때 variadic 템플릿 함수에 잘못된 수의 인수를 제공하려면 어떻게해야합니까? 나는 이해하지 못한다. –

+0

각 컨테이너에 반복기가 있고 여러 번 진행할 수 있기 때문에 값을 추출 할 수 없습니다. 다른 호출은 f. 각 반복자에 대해이 논리를 개별적으로 처리해야하므로 인수에서 인수 및 목록 작성이 필요하다고 생각합니다. –

+0

@SamuelDanielson :'Test ()'은 1 개의 인수만을 허용합니다. 1보다 큰 숫자를주었습니다. – kennytm

관련 문제