关于__type_traits的设计思想

/* 
 * File:   main.cpp
 * Author: Vicky.H
 *
 */
//#include 
#include 

namespace cn_vicky {
    
    /** 2两个空白类,没有任何成员,不会带来额外负担,却能通过类型代表真假,可以用于函数特化参数 */
    struct __true_type { };
    struct __false_type { };
    
    template 
    struct __type_traits {
        typedef __true_type this_dummy_member_must_be_first;
        // 不要移除这个成员 
        // 它通知能自动特化__type_traits的编译器, 现在这个__type_traits template是特化的 
        // 这是为了确保万一编译器使用了__type_traits而与此处无任何关联的模板时 
        // 一切也能顺利运作 

        // 以下条款应当被遵守, 因为编译器有可能自动生成类型的特化版本 
        //  - 你可以重新安排的成员次序 
        //  - 你可以移除你想移除的成员 
        //  - 一定不可以修改下列成员名称, 却没有修改编译器中的相应名称 
        //  - 新加入的成员被当作一般成员, 除非编译器提供特殊支持 


        typedef __false_type has_trivial_default_constructor;
        typedef __false_type has_trivial_copy_constructor;
        typedef __false_type has_trivial_assignment_operator;
        typedef __false_type has_trivial_destructor;
        typedef __false_type is_POD_type;
    };
}

template 
void doSth(T& t, cn_vicky::__true_type) {
    std::cout << "true" << std::endl;
}

template 
void doSth(T& t, cn_vicky::__false_type) {
    std::cout << "false" << std::endl;
}

template 
void doSth(T& t) {
    typedef typename cn_vicky::__type_traits::is_POD_type is_POD_type;       /**注意!!!*/
    doSth(t, is_POD_type());
}


class A {
public:
};

class B {
};


namespace cn_vicky {
    template <>
    struct __type_traits {
        typedef __true_type is_POD_type;
    };

    template <>
    struct __type_traits {
        typedef __false_type is_POD_type;
    };
}

/*
 * 
 */
int main(void) {
    A a;
    B b;
    doSth(a);   // true
    doSth(b);   // false

    return 0;
}

true
false

你可能感兴趣的:(C/C++)