2014-10-17 2 views
1

컴파일 타임 상수를 매개 변수로 취할 수있는 함수를 작성하는 C++의 방법이 있습니까?하지만 실행 시간에 종속 된 값을 전달할 경우 컴파일 오류가 발생합니까? 특히 null 포인터로 초기화하는 것이 허용되는 동작을하는 생성자가 있지만 null이 아닌 포인터로 초기화하면 펑키 한 작업이 진행되는 것을 의미합니다.컴파일 타임 상수 매개 변수 만 사용하는 함수 작성?

세부 사항 : 클래스는 스마트 포인터로 구성 될 수 있지만 (null이 아닌) 원시 포인터로 구성되어서는 안됩니다. 간결함을 위해 null 포인터 리터럴에서 직접 초기화 할 수 있기를 원하지만 스마트 포인터는 원시 포인터의 암시 적 변환을 허용하지 않습니다. 즉, 스마트 포인터에 null 포인터를 명시 적으로 래핑하기 위해 각 사용 지점에 필요한 추가 명령이 있습니다. 래핑을 생성자로 이동하여 코드를 중복 제거하는 것이 좋습니다.

나는 이것을 수행하는 한 가지 방법은 전달 된 매개 변수가 null이 아닌지 런타임 검사를 사용하는 것이지만, 가능한 경우 일반 원시 포인터 변환을 컴파일 타임에 잡도록하는 것이 좋습니다. 원시 포인터가 확실히 널인 경우에만 컴파일을 허용합니다.

(당신의 기술은 C++ (11) 또는 C++ 14 기능에 의존하는 경우 언급하시기 바랍니다.)

+4

* 모든 포인터를 가져 가지 않고 빈 스마트 포인터로 취급하는 기본 생성자를 사용하는 것이 더 쉽지 않을까요? 나는. 두 개의 생성자, 스마트 포인터를 사용하는 생성자 및 * nothing *을 사용하는 생성자? 왜 단순히 전달하지 않고 NULL을 전달하기 위해 호출 측에 onus를 두는가? – WhozCraig

+0

디버그 빌드 유형으로 제한하는 런타임 검사와 함께 고려할 수 있습니다. 컴파일 타임 체크를 고수하고 싶다면'static_assert'를 고려해보십시오. –

답변

0

C++ (11) 때문에, 당신은 당신이 원하는 무엇을 std::nullptr_t를 사용할 수 있습니다.

Demo.