2017-03-20 3 views
0

내가 만들고있는 클래스의 최대 크기를 명시 적으로 제한하려고하고 있지만 작동하지는 않지만 보이지 않는 것처럼 보입니다. 이 예제는 다소 고안된 것이지만 상황이 자연스럽게 발생하는 경우를 대비해서 알고 싶습니다.C++ 이니셜 라이저 목록 제약 확인

PriorityQueue(const unsigned int maxSizeIn) : 
      maxSize((maxSizeIn >= SOME_CONSTANT) ? SOME_CONSTANT - 1 : maxSizeIn), 
      queueArray(new PriorityPair<T>*[maxSizeIn]()), 
      currentHeapSize(0) 
{ 

} 

clunkiness는 intializer 목록에서 삼항 표현을 갖는에서 오는 : 그대로

는 여기있다. 이 방법이 효과가 있지만, 특히 좋지는 않습니다. 목록의 각 구성 요소를 한 줄씩 구분해야합니다. 나는 그 논리를 생성자의 몸으로 옮기려고 시도했지만 어떻게 시도했는지에 관해 논란이있었습니다.

명확성을 위해 필자가 원하는 것을 더 잘 강조하기 위해 원본을 편집했습니다. 즉, 이니셜 라이저 목록에 제약 조건을 넣기 위해 더 깨끗한 기능적으로 동일한 방법이 있습니다.

이와 같은 문제에 대한 해결 방법은 무엇입니까?

+0

왜'maxSizeIn'은'numum_limits :: max()'와 같지 않습니까? – NathanOliver

+0

@ NathanOliver 그 부분은 임의적입니다. 나는 그 모든 것의 clunkiness에 더 관심이있다. – Caboose

답변

0

당신은 그것에 대해 std::min을 사용합니다 :

여기
maxSize(std::min(maxSizeIn, std::numeric_limits<unsigned int>::max() - 1)); 

, std::numeric_limits<unsigned int>::max() - 1는 어떠한 상수가 될 수 - SOME_CONSTANT 것입니다 귀하의 예제에서.

귀하의 경우에는 아무런 의미가 없지만 유의하십시오. maxSizeIn은 해당 유형의 최대 값보다 클 수 없습니다. 누군가가 생성자에 std::numeric_limits<unsigned int>::max()보다 큰 크기를 지정하면 해당 사용자는 인수가 오버플로되었음을 빠르게 알 수 있습니다.

대신 unsigned long을 전달할 수 있습니다.

+0

원래 게시물을 편집하여 내가 원하는 것을 더 잘 강조했습니다. 같이 갔던 예는 제대로 고안되지 않았습니다. 나는 std :: min이 단지 랩퍼 일지라도 솔루션이 너무 짧고 깨끗해질 것이라고 생각한다. maxSize 이후의 대괄호는 intializer 목록에 유효한 구문입니까? – Caboose

+0

@Caboose 예, C++ 11 기능입니다. 나는 그것을 바꿀 것이다 :) – Rakete1111

+0

@Caboose 당신의 명료화는 나를 위해 정말로 명확히하지 않는다. 가지고있는'SOME_CONSTANT '에'std :: min'을 사용할 수 있습니다. 더 복잡한 제약이 있다는 것을 의미합니까? – Rakete1111