2017-11-27 22 views
16

필자는 내 자신의 형식을 어떤 비교 자도 사용하지 않고 전문화하지 않고 std::numeric_limits을 만들었습니다. 그럼에도 불구하고, 어떤 이유로 든 std::numeric_limits<MyType>은 정상적으로 컴파일됩니다. 왜 C++ 표준위원회는 numeric_limits 템플릿을 정의하여 비 숫자 형을 포함하여 모든 유형에 유효합니다. 아래C++ : numeric_limits가 모르는 유형에서 작동하는 이유는 무엇입니까?

예제 코드 :

#include <iostream> 
#include <limits> 
using namespace std; 

// This is an int wrapper that defaults to 666 instead of 0 
class A { 
public: 
    int x; 
public: 
    A() : x(666) {} 
}; 

int main() { 
    A a = std::numeric_limits<A>::max(); 
    A b = std::numeric_limits<A>::max(); 

    std::cout << a.x << "\n" << b.x; 
    // your code goes here 
    return 0; 
} 
+1

[그냥 몇 가지 관찰 (HTTP : //coliru.stacked- 그래서, 당신은 클래스 템플릿은 전문 여부에 대한 구성원의 액세스를 지키는 것이 가장 좋은 선택이 될 것입니다 (C++ 17을 사용) crooked.com/a/d9083caa1a24b93c). – user0042

+1

'x'를 비공개로 설정하여 오류를 추가했습니다. 더 나은 예제를 원한다면'class A '를'class A {}'로 대체하고'std :: cout'을 삭제하십시오. 코드는 여전히 컴파일됩니다. 이유가 무엇입니까? – tohava

+0

질문에 답을하십시오. 서면으로 "이게 어떻게 생겼어?"라고 묻습니다. 하지만 "왜 C++ 표준위원회가 numeric_limits 템플릿을 정의하여 숫자가 아닌 유형을 포함하여 모든 유형에 유효합니까?"라고 묻는 것 같습니다. –

답변

12

템플릿 std::numeric_limits 템플릿 메타 프로그래밍을 수행하기 전에 <limits.h>에서 매크로를 대체 추가 된 클래스는 것이었다 : 그것은 사전 표준에 있었다 공개적 ~ 1995 (초안을 회람). 템플리트 메타 프로그래밍은 스톡홀름 회의 (1996 년 7 월)에서 Erwin Unruh에 의해 고안되었습니다. 이 시점에서 아무도 클래스 템플릿이 정의되어 있는지 여부를 감지 할 수 있는지 여부를 생각하지 않았습니다. 대신 std::numeric_limits<T>::is_specialized은 클래스 템플릿이 T 유형에 대해 특수하고 의미 있는지 여부 (컴파일 타임에)를 나타냅니다. 다양한 멤버는 합리적인 기본값을 사용하도록 정의되었으므로 컴파일되지 않은 유형에 대한 값을 사용하지 않도록 generic이 구현되지만 컴파일 된 코드를 얻을 수 있습니다.

std::numeric_limits은 C++ 표준 에서처럼 지정되어 있으므로 아주 좋은 이유없이 변경되지 않습니다. 변경 사항은 누군가의 코드를 손상시킬 수 있습니다.이 코드는 현재 발견 된 기술로 더 잘 수행 될 수 있습니다 (일부는 C++에서는 진정으로 사용할 수 없습니다. 98). 이위원회는 지금 이와 같은 형질을 고안하지 않을 것입니다 : <type_traits>의 형질 특성은 독립형 형질입니다. 일반적으로 적절한 기본값으로 모든 실행 가능한 유형에 대해 여전히 정의되어 있습니다. 그러나 현재 정의가 작동하기 때문에 깨는 방법으로 std::numeric_limits을 변경할 이유가 없습니다.

std::numeric_limits<T>의 모든 구성원이 모든 유형의 T에 유효하지 않습니다. 예를 들어, std::numeric_limits<T>::max()의 사용은 T의 기본 생성자가 액세스 할 수 없거나 사용할 수 없거나 delete 인 경우 컴파일되지 않습니다.

template <typename T> 
void f() { 
    if constexpr (std::numeric_limits<T>::is_specialized) { 
     // use of std::numeric_limits<T>::max(), min(), etc. 
    } 
    else { 
     // implement the rquired functionality differently 
    } 
} 
+0

그럴듯한 설명입니다. 그러나 가짜 값을 자동으로 제공하기 위해 "최소/최대"를 선택한 이유는 무엇입니까? 이 경우'std :: abort'를 호출하지 않을까요? – geza

+0

@geza : 저는 모릅니다. 제안서의 기록이'std :: numeric_limits' 제안서에 시간이 흘렀다 고 생각하지 않습니다 (그리고 노트는 최근에야 시작되었습니다). D & E와 나는 D & E가 도서관의 많은 부분을 다루지 않는다고 생각합니다. –