2009-11-22 4 views
2

은 다음 코드 조각을 고려C++ 템플릿 대 집계

class B { 
    private: 
    // some data members 
    public: 
    friend bool operator==(const B&,const B&); 
    friend ostream& operator<<(ostream&,const B&); 
    // some other methods 
}; 

template <typename T=B> 
class A { 
    private: 
    // some data members 
    vector<vector<T> > vvlist; 
    public: 
    // some other methods 
}; 

내 요구 사항 유형 매개 변수로 전달되는 타입 T는 연산자 ==와 운영자 < < 방법에 대한 정의를 제공해야한다는 것입니다. T에 대한 다른 제한 사항을 적용하고 싶지 않습니다.

어떻게하면됩니까?

내가 생각할 수있는 한 가지 방법은이 두 가지 방법을 선언하는 "Z"라고하는 추상 클래스를 만드는 것입니다. 다음

vector<vector<Z> > vvlist; 

를 작성하고 템플릿으로 클래스 A가 없습니다.

더 좋은 방법이 있나요?

+1

A가 어디에서나이 연산자를 사용하면 코드에 T가 없으면 코드가 컴파일되지 않습니다. 그보다 더 잘하고 싶니? 게다가, T는 또한 std :: vector의 요구 사항을 충족시켜야합니다. 복사가 가능해야합니다. – UncleBens

+0

오! 승인. 그렇다면 아마도이 예제는 문제가되지 않습니다. 하지만 방금 일부 기능 대신 예제로 제공했습니다. – user855

답변

4

자동으로 발생합니다.

코드에서 연산자 ==<<을 호출하면 해당 연산자가 정의되지 않은 유형이 클래스에 전달되면 코드가 컴파일되지 않습니다.

본질적으로 오리 타이핑입니다. 마치 오리처럼 보이고 오리처럼 쑤셔지면 오리입니다. 사용하려고하는 기능을 노출하는 한 그것이 IDuck 인터페이스를 구현하는지 여부는 중요하지 않습니다.

0

컴파일 타임에 T에 필요한 항목을 테스트하는 개인 메소드를 A에 작성할 수 있습니다.

void TestReq(T x, T y) 
{ 
    if (x==y) 
    cout << x; 
} 

이렇게 간단한 정수가 통과하고 작동하는 방식입니다.

+1

아닙니다. 이 메서드를 호출해야합니다. 그렇지 않으면 컴파일되지 않을 수 있습니다. 즉, 이것을 가지고 있으면 모든 것이 통과 될 것입니다. – UncleBens

3

개념 검사 라이브러리를 찾는 것처럼 보입니다. Boost가 제공하는 서비스를 확인하십시오 : Boost Concept Check Library. 이 링크에는 개념에 대한 설명도 있습니다. 인용구 :

개념은 유형 올바르게 호출 인수에 사용하기 위해 충족해야하는 요구 사항 (유효 표현, 관련 유형, 의미 불변, 복잡성 보장 등)의 집합입니다 귀하의 질문에 일반적인 알고리즘

에, 개념은 "유형 Toperator==operator<<를 제공해야합니다"입니다.