2009-03-13 6 views
8

정수 값을 매개 변수로 사용하는 C++의 템플릿을 사용하는 경우 변수가 함수 호출에서 매개 변수로 사용 된 경우와 다른 매개 변수로 사용되는 정수 변수에 대한 요구 사항이 있습니까?C++ 템플릿 매개 변수의 요구 사항은 무엇입니까?

이 질문은 here의 후속 조치입니다. 함수 또는 템플릿에 대해 "extern const int"로 선언 된 WRT 변수의 차이점이 있다면 구체적으로 설명하고 싶습니다.

일부 템플릿의 경우 매개 변수 값이 컴파일 타임에 필요하다는 것을 알 수 있습니다. 항상 사실입니까? 특정 매개 변수 값을 사용하는 경우에만 런타임에 값을 사용하도록 지정하는 방법이 있습니까?

답변

3

컴파일 타임에 int 값이 항상 필요합니다.

각 템플릿 인스턴스화는 컴파일 된 코드의 개별 조각이므로 (정수 템플릿 매개 변수의 경우에도 마찬가지 임) 컴파일 할 때 정수를 사용할 수 있어야하며 변경할 필요가 없어야합니다.

많은 수의 고유 값을 사용할 때 정수 템플릿 매개 변수를 사용하지 않는 것이 좋습니다. 즉, 거대한 실행 파일로 빠르게 끝날 수 있습니다.

13

다음은 표준 규격입니다.

14.3.2.1 :

비 유형에 대한 템플릿 인수 비 서식 템플레이트 매개 변수 중 하나가 될 것이다 :

  • 정수 또는 열거 적분 상수 표현식 유형; 또는
  • 비 형식 템플릿 매개 변수의 이름. 또는
  • 함수 템플리트 및 함수 템플리트 ID를 제외하고는 함수 템플리트 및 함수 템플리트를 제외하고 외부 연결이있는 객체 또는 함수의 주소는 & id-expression으로 표시되며 여기서 이름은 함수를 나타내는 경우 &은 선택 사항입니다. 배열 또는 해당 템플릿 매개 변수가 참조 인 경우; 또는
  • 5.3.1에서 설명한대로 표현 된 멤버에 대한 포인터.

5.19.1 : 배열 범위 (8.3.4, 5.3.4)와 같은 경우의 식으로서 : 여러 곳에

는, C++은 정수 또는 열거 정수로 평가 식을 필요 (9.6), 열거 자 초기화 자 (7.2), 정적 멤버 초기화 자 (9.4.2) 및 정수 또는 열거 형 비 템플릿 템플릿 인수 (14.3)로 사용할 수 있습니다.

constant-expression: 
      conditional-expression 

불가분의 일정한 표현이 수반 할 만 리터 (2.13), 열거, CONST 변수 또는 상수 식 (8.5), 정수 또는 열거 비 형 템플릿 파라미터로 초기화 정수 또는 열거 타입의 정적 데이터 멤버 유형 및 크기를 나타냅니다. 부동 리터럴 (2.13.3)은 정수 또는 열거 형으로 형변환 된 경우에만 나타날 수 있습니다. 정수형 또는 열거 형 유형 변환 만 사용할 수 있습니다.특히, sizeof 표현식을 제외하고, 함수, 클래스 객체, 포인터 또는 참조는 사용되지 않으며 할당, 증가, 감소, 함수 호출 또는 쉼표 연산자는 사용되지 않아야한다. 이전 게시물에 대하여

나는 부분의 본질 "CONST 변수 ... 이와 ...을 초기화"믿는다 (나는 외부 초기화 카운트 생각하지 않습니다).

4

정수 상수 표현식이어야합니다. 즉 5.19의 표준 문서에 의해 설명 같습니다

불가분의 일정한 표현 만 리터 (2.13), 열거, CONST 변수 또는 상수 식 (8.5)으로 초기화 정수 또는 열거 타입의 정적 데이터 구성원을 포함 할 수 있으며, 비 형식 또는 열거 형의 -type 템플릿 매개 변수 및 sizeof 표현식. 부동 리터럴 (2.13.3)은 정수 또는 열거 형으로 형변환 된 경우에만 나타날 수 있습니다. 정수 또는 열거 유형에 대한 유형 변환 만 사용할 수 있습니다.

"정수"는 "정수"의 또 다른 용어이지만 "int"와는 다릅니다. 예를 들어 "char"은 정수/정수 유형이지만 int 유형은 아닙니다. 그래서 구체적으로, 다음은

  • 물론 10 or 10L or anything like that
  • enum { THIS, OR, THAT };
  • int const this_one = 10;
  • sizeof(char)
  • ,

위에 설명 된대로 다른 템플릿 매개 변수를 허용 사람들의 모든이 될 수 있습니다 정수 유형이 th 인 매개 변수의 템플릿 인수로 사용됩니다. e 해당 유형. 일부 전환은 여전히 ​​적용됩니다. 따라서 int를 원하고 char을 전달하면 자동으로 char을 int로 승격합니다. 열거자를 제공하고 int를 원할 때도 마찬가지입니다. 그 규칙에 의해 그래서

, 당신은

extern const int SomeName; 

을 가지고 그리고 그것은 중요한 상수 식으로 상수,이 템플릿 인수로 사용할 수 없습니다 초기화 정의를 표시하지 않는 경우. 물론 함수 인수로 사용할 수 있습니다. 그것들은 타입의 일부가 아니기 때문에 컴파일 타임에 알 필요가 없습니다. 순간 당신은 템플릿 특수화의 이름을, 당신은 유형의 일부가 사용되는 인수 :

MyGreatStack<int, 4> // 4 is now part of the type MyGreatStack<int, 4>! 

참고 는 인수로 SomeName을 전달하는 다른 방법이 있다는 것을. 그러나 모두 이 아닌 정수 템플릿 매개 변수로 허용되는 일 수 있습니다. 당신은 예를

template<const int& V> struct NowItWorks { }; 

를 들어, 참조 매개 변수에 의해 위의 내용을 받아 들일 수 그리고 위의 SomeName을 받아 들일 것입니다. 이제는 값이 아니라 전체 프로그램에서 고유 한 특정 위치 (변수에 extern 연 결이 있음)가 선택되었습니다.

관련 문제