>

템플릿 전문화에는 미묘한 트릭이있어서 basic POD 에 전문화를 적용 할 수 있습니다.  (기본 POD를 말할 때 특히 POD 구조를 원하지 않습니다 (그러나 가져 가겠습니다)).

template<typename T>
struct DoStuff
{
    void operator()() { std::cout << "Generic\n";}
};
template<>
struct DoStuff</*SOme Magic*/>
{
    void operator()() { std::cout << "POD Type\n";}
};

또는 내장 유형마다 전문화를 작성해야합니까?

template<typename T>
struct DoStuff
{
    void operator()() { std::cout << "Generic\n";}
};

// Repeat the following template for each of
// unsigned long long, unsigned long, unsigned int, unsigned short, unsigned char
//          long long,          long,          int,          short, signed   char
// long double, double, float, bool
// Did I forget anything?
//
// Is char covered by unsigned/signed char or do I need a specialization for that?
template<>  
struct DoStuff<int>
{
    void operator()() { std::cout << "POD Type\n";}
};

단위 테스트.

int main()
{
    DoStuff<int>           intStuff;
    intStuff();            // Print POD Type

    DoStuff<std::string>   strStuff;
    strStuff();            // Print Generic
}


  • 답변 # 1

    사용자 정의 POD 유형이 아닌 기본 유형 만 원한다면 다음이 작동합니다.

    #include <iostream>
    #include <boost/type_traits/integral_constant.hpp>
    #include <boost/type_traits/is_fundamental.hpp>
    #include <boost/type_traits/is_same.hpp>
    template<typename T>
    struct non_void_fundamental : boost::integral_constant<
        bool,
        boost::is_fundamental<T>::value && !boost::is_same<T, void>::value
    >
    { };
    template<typename T, bool Enable = non_void_fundamental<T>::value>
    struct DoStuff
    {
        void operator ()() { std::cout << "Generic\n"; } const
    };
    template<>
    struct DoStuff<T, true>
    {
        void operator ()() { std::cout << "POD Type\n"; } const
    };
    
    

    사용자 정의 POD 유형도 원하는 경우 boost::is_pod<> 를 사용하십시오.   non_void_fundamental<> 대신  (그리고 C ++ 11을 사용하고 최적화 목적 으로이 작업을 수행하는 경우 std::is_trivially_copyable<> 를 사용하십시오  C ++ 11에서는 많은 특성이 표준 라이브러리에 추가되었으며, 특히 흥미로운 전문화 (특히 비트 조작)를 목표로하는 것 같습니다.

    관심을 가질 수있는 최상위 특성은 std::is_trivial 입니다. 그러나 다른 많은 것들이 있습니다 :

    std::is_trivially_default_constructible

    std::is_trivially_copy_constructible

    std::is_trivially_move_constructible

    std::is_trivially_copyable  ( memcpy 를 통해 복사 가능 )

    일반적으로, 표준은 가능한 한 미세한 특성을 얻으려고 노력했기 때문에 is_pod 와 같은 광범위한 가정에 의존 할 필요가 없습니다.  대신에 여러분의 분석법이 실제로 필요한 것에 맞게 제약 조건을 미세 조정하십시오.

  • 답변 # 2

    부스트는 boost::is_pod . 찾고 계십니까?

    (사용한 적이 없어서 예제에 필요한 정확한 코드를 작성하려고해도 당황하지 않습니다.)

관련 자료

  • 이전 tabular - 페이징없는 GWT 21 데이터 프리젠 테이션 위젯
  • 다음 c# - AssemblyCreateInstance 및 보안