2012-10-16 2 views
6

수학 벡터 템플릿을 쓰고 싶습니다. 형식 및 크기를 템플릿 인수로 사용할 수있는 수학 연산 메서드가 많은 클래스가 있습니다. 이제 벡터 < 3>이 데이터 [0..3]을 각각 참조하는 멤버로 x, y, z를 갖는 전문화를 작성하려고합니다.C++ - 특수화를위한 기본 템플릿으로 사용

문제는 기본 클래스를 만들거나 모든 것을 두 번 쓰지 않고 기본 템플릿에서 모든 것을 상속하는 전문화 방법을 모르는 것입니다.

가장 효과적인 방법은 무엇입니까?

template<class Type, size_t Size> 
class Vector { 
    // stuff 
}; 

template<class T> 
class Vector<3,T>: public Vector { 
    public: 
     T &x, &y, &z; 
     Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){} 
     // and so on 
}; 
+2

기본 클래스를 만드는 것이 일반적인 방법입니다. –

답변

7

어쨌든 기본 구현에서 파생 될 수 있어야하지만 인스턴스를 전문으로하는 방법은 무엇입니까? 당신이 그것을 파생시킬 수있는 비 특화된 버전이어야합니다. 그래서 간단합니다 추가, 외부 인터페이스를

// Add one extra argument to keep non-specialized version! 
template<class Type, size_t Size, bool Temp = true> 
class Vector { 
    // stuff 
}; 
// And now our specialized version derive from non-specialized version! 
template<class T> 
class Vector<T, 3, true>: public Vector<T, 3, false> { 
    public: 
     T &x, &y, &z; 
     Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){} 
     // and so on 
}; 
+0

이것은 잘 작동하지만 외부 인터페이스에서 내부 템플릿 매개 변수를 사용하는 것은 다소 부담 스럽습니다. – Cameron

+0

사용자는이 추가 템플릿 매개 변수를 절대 사용하지 않습니다. 물론 특수 구현과 기본 구현이 모두 실제 구현을 포함하는 기본 클래스에서 파생 된 다른 옵션을 가지고 있습니다! 그러나 제 의견으로는이 기술보다 조금 더 어렵습니다! – BigBoss

+0

@BigBoss 니스, 고마워. – weltensturm

1

는 조금 다른 방식으로이을 고려하지만, 목표를 달성 할 것 - 나는 독립 기능의 X를 (평균), Y(), Z를() :

template<class T, size_t S> 
T& x(Vector<T, S>& obj, typename std::enable_if<(S>=1)>::type* = nullptr) 
{ 
    return obj.data[0]; 
} 

template<class T, size_t S> 
T& y(Vector<T, S>& obj, typename std::enable_if<(S>=2)>::type* = nullptr) 
{ 
    return obj.data[1]; 
} 

template<class T, size_t S> 
T& z(Vector<T, S>& obj, typename std::enable_if<(S>=3)>::type* = nullptr) 
{ 
    return obj.data[2]; 
} 

Vector<T, 3>& obj 
return obj.x(); 

그리고

Vector<T, 3>& obj 
return x(obj); 
,691 : 사이에 큰 차이가

없다

보너스로 -이 인터페이스는 크기가 일치하는 데 적합합니다.

관련 문제