비구성 함수에 대한 암시적 변환 방지
정수 매개변수를 기대하지만 다른 유형의 암시적 캐스팅을 허용하는 비구성 함수를 고려하세요. 문자, 부울, Long과 같은 것입니다. 이러한 의도하지 않은 동작을 방지하고 함수가 지정된 유형의 매개변수만 허용하도록 하려면 다음 기술을 사용할 수 있습니다.
C 11 이상 방법:
가장 직접적인 접근 방식은 다른 모든 유형과 일치하는 함수 템플릿을 정의하는 것입니다.
void function(int); // this will be selected for int only template <class T> void function(T) = delete; // C++11
직접 일치하는 비템플릿 함수가
C 11 이전 기술:
C 11 이전에는 원하는 동작을 시행하기 위해 도우미 클래스를 만드는 대체 솔루션이 있었습니다.
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template <class T> void function(T a, DeleteOverload = 0); void function(int a) {}
이 기술은 유사한 시그니처를 가진 여러 함수를 오버로드하는 데 의존합니다. 여기서 예상되는 유형의 함수는
C 23 업데이트:
C 23에서는 이 상황을 처리하는 더 간결하고 유익한 방법을 소개합니다.
void function(int) {} // this will be selected for int only template <class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); }
내에서 static_assert 사용 함수 템플릿은 예상치 못한 매개변수 유형으로 함수를 호출할 때 명확한 오류 메시지를 제공합니다.
위 내용은 C의 비구성 함수에서 암시적 변환을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!