객체가 필수인지 클래스 유형인지 아닌지 아는 요점은 무엇입니까?


14

안녕하세요 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, ...) 그러나 모든 튜토리얼 만 희망이 예를 보여줍니다 만 truefalse.

  • 이 템플릿을 사용하는 작은 유용한 예를 들어 주시겠습니까?


1
간단한 예- std::copy. 의 유형이 경우 어떻게 std::copy의 배열과 같은 "간단한"있다 int거나 char? 을 사용 memcpy하시겠습니까? "유형이 간단한 경우 memcpy를 사용하고 그렇지 않으면"느린 "루프를 사용하십시오"라고 어떻게 말합니까?
PaulMcKenzie

답변:


17

콘솔에 쓰는 것이 아닙니다.

더 광범위하게 묻는 것은 유형 특성의 요점이 무엇입니까?

답은 템플릿 메타 프로그래밍 입니다. 예를 들어, 정수 유형과 비 통합 유형에 대해 수행하는 템플리트 전문화를 작성할 수 있습니다.

아론 BULLMAN는이 특성을 입력하는 간단한 소개를 제이 섹이처럼, 여기 .

제 생각 에는 이러한 것들의 대부분의 사용은 멋진 기능과 클래스 및 유틸리티 (예 : 라이브러리)의 구현 내에 모든 것을 작동시키는 배경 기계의 일부로 묻혀 있습니다.

더 읽을 거리 :

첫 번째 질문에 대한 rightfold의 대답은 특성이 유용한 경우에 대한 훌륭한 예를 제공합니다.

예를 들어, 반복자가 POD에 대한 포인터 인 경우 구현은 명시 적 루프 대신 내부적으로 std::copy사용할 수 있습니다 std::memcpy. 이것은 SFINAE로 달성 할 수 있습니다.


예를 들어, 특정 유형에 대해 템플릿의 일부 인스턴스를 비활성화하는 데 사용할 수 있습니다. 예를 들어 Power<T>인수 유형이 정수가 아닌 경우 템플릿 함수 또는 클래스 를 비활성화하는 것이 논리적입니다. std :: string?
Rami Yen

1
@RamiYen, 예 . SFINAE 라고합니다 .
chris

7

템플릿 메타 프로그래밍 용입니다. 최종 사용자가 어떤 유형 (들)을 템플릿에 전달할 지 모른다면. 때로는 오류를보고하고 때로는 전달 된 유형을 전문화해야합니다. 때로는 조합입니다.

cppreference.com에 표시된 예 (예 : https://en.cppreference.com/w/cpp/types/is_enum )는 매우 단순화되었으며 특성을 비표준 방식으로 사용하는 방법을 보여줍니다. 이러한 특성을 간단한 (템플릿이 아닌 함수 또는 클래스)에서 직접 사용하는 일은 거의 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.