[c++] 객체가 필수인지 클래스 유형인지 아닌지 아는 요점은 무엇입니까?
안녕하세요 Cppreference.com에서 이와 같은 많은 예를 보았습니다.
std::is_class<T>
std::is_integral
등등. 내가 얻을 예를 들어 코드를 실행하면 알 수 true
또는 false
. 그러나 그 점은 무엇입니까? 예를 들어 객체가 클래스 유형인지 아는가?
#include <iostream>
#include <type_traits>
struct A {};
class B {};
enum class C {};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<A>::value << '\n';
std::cout << std::is_class<B>::value << '\n';
std::cout << std::is_class<C>::value << '\n';
std::cout << std::is_class<int>::value << '\n';
}
출력 :
true
true
false
false
-
나는 이것을 사용하여 실제 예를 들어 모두를 통해 검색 한 (
is_class
,is_integral
,is_arithmetic
, …) 그러나 모든 튜토리얼 만 희망이 예를 보여줍니다 만true
나false
. -
이 템플릿을 사용하는 작은 유용한 예를 들어 주시겠습니까?
답변
콘솔에 쓰는 것이 아닙니다.
더 광범위하게 묻는 것은 유형 특성의 요점이 무엇입니까?
답은 템플릿 메타 프로그래밍 입니다. 예를 들어, 정수 유형과 비 통합 유형에 대해 수행하는 템플리트 전문화를 작성할 수 있습니다.
아론 BULLMAN는이 특성을 입력하는 간단한 소개를 제이 섹이처럼, 여기 .
제 생각 에는 이러한 것들의 대부분의 사용은 멋진 기능과 클래스 및 유틸리티 (예 : 라이브러리)의 구현 내에 모든 것을 작동시키는 배경 기계의 일부로 묻혀 있습니다.
더 읽을 거리 :
첫 번째 질문에 대한 rightfold의 대답은 특성이 유용한 경우에 대한 훌륭한 예를 제공합니다.
예를 들어, 반복자가 POD에 대한 포인터 인 경우 구현은 명시 적 루프 대신 내부적으로
std::copy
사용할 수 있습니다std::memcpy
. 이것은 SFINAE로 달성 할 수 있습니다.
답변
템플릿 메타 프로그래밍 용입니다. 최종 사용자가 어떤 유형 (들)을 템플릿에 전달할 지 모른다면. 때로는 오류를보고하고 때로는 전달 된 유형을 전문화해야합니다. 때로는 조합입니다.
cppreference.com에 표시된 예 (예 : https://en.cppreference.com/w/cpp/types/is_enum )는 매우 단순화되었으며 특성을 비표준 방식으로 사용하는 방법을 보여줍니다. 이러한 특성을 간단한 (템플릿이 아닌 함수 또는 클래스)에서 직접 사용하는 일은 거의 없습니다.