2012-03-18 5 views
1

이 주제에 관해 수많은 질문을했지만 여전히 사용할 수있는 대답을 찾지 못했습니다.템플릿 클래스 멤버 함수 전문화?

나는 다음과 같이 그 선언, 템플릿 클래스가 있습니다

template <typename Type, int inSize> 
class sortedVector 
{ 
    public: 
     sortedVector(); 
     int getSize(); 
     int getAmountElements(); 
     bool add(const Type &element); 

    private: 
     Type *vector; 
     int size; 
     int amountElements; 
}; 

클래스는 요소의 모든 유형을 저장할 수있는 정렬 된 벡터를 표현하기로한다. 이것은 프로그래밍 과정에서 과제의 일부입니다. 지금까지는 할당에 주어진 주 함수가 정수와 유형의 객체를 모두 함수로 전달합니다. 다각형은 이전에 해본 클래스입니다.

벡터는 전달 된 다각형 객체의 영역 또는 전달 된 int 값에 따라 정렬되어야합니다.

이렇게하려면 add (const Type & 요소)의 두 가지 구현이 필요하다고 생각합니다. 하나는 int를 벡터의 올바른 위치에 넣고, 하나는 다각형의 영역을 가져 와서 벡터의 올바른 위치에 삽입하는 작업입니다.

템플릿 전문화에 대해 AFAIK와 이야기합니다.

여러 가지 방법을 시도했지만 지금까지 컴파일러 오류 만 만났습니다. 이것을 달성하기위한 가장 좋은 방법은 무엇입니까?

+0

이'도 비교 펑터를 저장하지 sortedVector' 안 :

그래서이 이런 sortedVector보기를위한 선언을 만들 것? – pmr

+0

==를 의미합니까? 아마, 나는 완전히 이것에 대해 새지만, 필요하다면, 나는 나중에 그것을 추가 할 것이다. 내가 무엇을 필요로 할까? :) – JKase

답변

2

C++에서 순서를 유지하는 컨테이너는 일반적으로 요소의 순서를 결정하는 데 사용되는 비교기의 템플릿 인수를 갖습니다.

template<typename Key, typename Compare = std::less<Key>, class Allocator = allocator<Key>> 
class set; 

당신은 아마이 연습에 대한 할당을 건너 뛸 수 있습니다 : 예를 들어 std::set에서보세요. 기본 Compare 펑 터는 operator< 사용하지만 다른 뭔가를 사용하려는 경우이 같은 set를 인스턴스화 할 수 있습니다

typedef std::set<int, std::greater<int> > MySet; 

그래서, 당신이 여기 전문화를 사용 할 필요가 없습니다. 어쨌든 수 있습니까? 이 얼마나 많은지 알 수 없기 때문에 정렬 된 벡터를 사용할 수있는 모든 수업을 전문으로 할 수는 없습니다.

template<typename Elem, 
     typename Compare = std::less<Elem> > 
class sortedVector { 
public: 
    // take the functor as a constructor argument in case it cannot be 
    // default constructed 
    sortedVector(Compare c = Compare()) : cmp_(c) {} 

    // ...snip... 
    void push_back(const Elem& x) { 
    cont_.push_back(x); 
    std::sort(begin(cont_), end(cont_), cmp_); 
    } 

private: 
    // trick just use a std::vector as storage and guarantee our sorted invariant 
    std::vector<Elem> cont_; 

    // we need to store the comparison functor in case it has state 
    Compare cmp_; 
}; 

#include<iostream> 
int main(){ 
    long long num; 
    std::cin>>num; 
    std::cout<<num; 
} 
+0

불행히도 내가 들어 본 적이없는 내용이며 할당의 성격과 제한 사항을 감안할 때이 경우 사용해서는 안된다고 생각합니다. 솔직히 말하면, 전문화에 대해 생각하는 잘못된 경로에있을 수도 있습니다. – JKase

+0

할당은 다음과 같습니다 : "이 과제에서는 주어진 클래스 또는 내장 C++ 데이터 유형을 저장할 수 있어야하는 템플릿 클래스 SortedVector를 만듭니다. 메서드 add()는 'false'를 반환해야합니다. 벡터가 꽉 찼다면 클래스가 가지고 있어야하는 것과 주어진 'main'의리스트가 물론 있습니다. – JKase

+0

그래서 이것은 꼭 필요한 것입니다. 기본 구현을 추가했습니다. 'std :: vector'에 의존하는 대신 자신을 저장하는 것입니다. 당신은 stdlib 기능에 의존하기를 원하지 않는다면 디폴트'Compare'를 건너 뛰고'sort'를 구현할 수 있습니다. – pmr

관련 문제