2012-02-18 5 views
0

시퀀스 크기를 결정하고 싶습니다. STL의 모든 시퀀스에 대해 .size() 멤버 함수를 사용할 수 있지만 시퀀스가 ​​배열 인 경우 문제가 발생합니다. 인수로 전달 된 시퀀스가 ​​배열 형식 또는 STL 시퀀스 형식인지 어떻게 프로그래밍 방식으로 확인할 수 있습니다.공통 인터페이스를 사용하여 시퀀스 크기 찾기

template<typename sequence> 
size_t find_size(sequence& s) 
{ 
// if s has .size() member function 
// return s.size() 
//else if it is an array type 
// return sizeof(s) 
//else throw error 
} 

는 기본적으로 난 C++ 11

PS에서 비회원 크기 우리는 비회원 시작이처럼 기능()과 end()를 찾고 있어요 : 시퀀스 나 순서 등을 의미 배열을 인수로 포함하여 STL에 정의되어 있습니다 (모두 .size() 멤버 함수가 있음).

답변

3

배열에 대한 find_size 함수의 오버로드로이 작업을 수행 할 수 있습니다.

// This overload expects an array to be passed by reference. 
template<typename T, size_t N> 
size_t find_size(T (&)[N]) { 
    return N; 
} 

// This overload takes any other type that supports T::size(). 
template<typename T> 
size_t find_size(T c) { 
    return c.size(); 
} 

그러나 포인터로 변환 된 배열에서는 작동하지 않습니다. 또한 C 라이브러리로 작업하지 않는 한 항상 C 스타일 배열에 대해 std::array을 사용하도록 제안합니다.

+0

사실, 나는 어떤 시퀀스 유형과도 독립적 이도록 그러한 인터페이스를 갖고 싶다. –

+0

당신이 무엇을 요구하고 있는지 잘 모르겠습니다. 두 가지가 아닌 한 가지 기능 만 사용하여 동일한 결과를 얻고 싶습니까? –

+0

오버로드 된 함수도 좋습니다. –

1

당신은 다음과 같은 것을 사용할 수 있습니다

template<typename T> 
size_t find_size(const T& c) 
{ 
    return distance(begin(c), end(c)); 
} 

을 나는 그것이 어떤 방식으로 효율적이라고 주장하지 않습니다하지만. 시퀀스의 크기를 얻는 것은 그 시퀀스와는 독립적이지 않습니다 (예를 들어, 링크 된리스트의 크기를 찾는 것은 근본적으로 벡터의 크기를 찾는 것과 다릅니다). 그리고 각각에 대해 과부하를 제안함으로써 더 효과적입니다 .size를 구현하지 않는 특정 유형의 시퀀스

1

실제로 시퀀스가 ​​무엇인지 (무엇이 아닌지) 구체적으로 설명하지는 않았지만 컨셉과 실행이 Boost.Range와 비슷하다면 아마도 boost::size이됩니다. 너에게 관심이있다.