2011-09-26 4 views
3

벡터 (valarrays와 비슷 함)에서 연산을 오버로드하는 것이 좋은 수치 시뮬레이션을 수행하고 있습니다. 예를 들어, 나는C++ 일반화 된 연산자 템플릿

template <typename T> 
vector<T> operator*(const vector<T>& A, const vector<T>& B){ 
    //blah blah 
} 

하지만 내가 벡터의 두 가지 유형에 관한 법률 (잠재적으로) 세 번째 형식을 반환하기 위해이 템플릿을 일반화하려는 경우를 쓸 수 있습니까? 나는. 나는 A와 B는 서로 다른 종류와 다른 구별 유형을 돌려 "A *의 B"상황에서 연산자를 사용하는 경우 위의 실제로 작동합니까, 지금

template <typename T, template U, template V> 
vector<V> operator*(const vector<T>& A, const vector<U>& B){ 
    //blah blah 
} 

을 쓰고 싶어요. 그러나 A와 B가 같은 유형이면 작동하지 않습니다. 물론 각 조합 (예 : T only, T and U only 또는 T, U, V)마다 다른 템플릿을 정의 할 수는 있지만보기에는 엉망입니다. 위에 주어진 T, U, V 다양성의 단일 템플릿 표현식을 사용할 수 있고 "A", "B"및 "A * B"가 모두 동일한 유형 (또는 단지 2 가지 유형?) 나는 A와 B는 별개 상황 "A *의 B"의 연산자를 사용하고 다른 형식을 반환하는 경우

+0

템플릿 인수 공제가 반환 값을 봅니다 (반환 유형에 오버로드 할 수 없음) – sehe

답변

1

지금, 위에서 실제로 작동 않습니다.

솔직히 말해서, 이것은 이해가되지 않습니다. V를 추론 할 수없고 세 번째 템플릿 매개 변수이기 때문에 템플릿이 전혀 작동하지 않아야합니다. 당신이 쓴 경우

template <typename V, template T, template U> 
vector<V> operator*(const vector<T>& A, const vector<U>& B){ 
    //blah blah 
} 

이 것 "작업"하지만 당신은 명시 적으로

operator*<double>(A, B); //where A is vector<int> and B is vector<float>, for example 

처럼 V, 뭔가를 지정한 경우 반드시 반환 할 V이 표현 T()*U()의 유형입니다 어디 vector<V> . 이것은 C++ 11에서는 가능하지만 C++ 03에서는 그렇게 할 수 없습니다 (내 말은, 당신은 어떤 타입 - 트레인을 최선의 방법으로 할 수 있습니다). 여기가 C++ 11을 끝낼 방법은 다음과 같습니다

template <typename T, template U> 
vector<decltype(T()*U())> operator*(const vector<T>& A, const vector<U>& B) 
{ 
    //blah blah 
} 

HTH

+0

@Kerrek SB : Oops, copy-paste artifact :) 필요하지 않습니다. 감사합니다 –

+0

나는 또한 당신이 모르는 반환 유형의 작업 유틸리티에 대해 궁금해. 이 익명의 벡터로 무엇을 할 것입니까? 어쩌면 이해가 될지 모르지만 나는 그것에 대해 불안해합니다. –

+0

@Kerrek SB : 그게 자동 이냐입니다 :'auto v = A * B;' –

0

이 decltype와 C++ 0X에서 작동 할 수 있습니다. 이 mechanism-을 사용하고 같은 것을 할 수 없습니다 mechanism- T와 U가 자신의를 제공하지 않는 것이 염치없이

template <typename T, template U> 
vector<decltype(declval<T>() + declval<U>())> 
operator*(const vector<T>& A, const vector<U>& B){ 
    //blah blah 
} 

. T, U 및 반환 유형이 모두 동일한 유형 만 처리 할 수 ​​있습니다. 그러나 기본 유형을 처리 할 수 ​​있습니다. 촉진 유형을 찾으려면 +과 같은 연산자를 다양한 원시 유형에 적용한 결과에 대한 부스트 유형 특성이 있습니다.

+0

감사합니다.이 질문에 대한 답변도 있습니다! – andyInCambridge

+0

왜'+'입니까? '*'이되어서는 안됩니까? –

0

다른 사람들이 지적했듯이 이것을 달성하기 위해 decltype을 사용할 수 있습니다. C++ 0x는 특정 템플릿 연산을 수행하지 않고도 모든 템플릿 인수가 강제 변환 될 수있는 유형을 추론하는 템플릿 common_type을 제공합니다. 따라서 인수 유형에 대해 오버로드 된 연산자를 사용할 수없는 경우에도 사용할 수 있습니다.