• C++中的Traits技法


    Traits广泛应用于标准程序库。Traits classes使得“类型相关信息”在编译期可用。
    认真读完下面的示例,你应该就懂了Traits技法,其实并不难。

    #include <bits/stdc++.h>
    using namespace std;
    
    //1,确认若干你希望将来可取得的类型相关信息
    struct TypeOneTag {};
    struct TypeTwoTag {};
    struct TypeThreeTag: public TypeTwoTag {};
    struct TypeFourTag: public TypeThreeTag {};
    
    //2,在你将使用的类中为该信息选择一个名称
    class ClassOne {
    public:
        typedef TypeOneTag TypeCategory;
    };
    
    class ClassTwo {
    public:
        typedef TypeTwoTag TypeCategory;
    };
    
    class ClassThree {
    public:
        typedef TypeThreeTag TypeCategory;
    };
    
    class ClassFour {
    public:
        typedef TypeFourTag TypeCategory;
    };
    
    //3,提供一个template和一组特化版本
    template<typename T>
    struct TypeTraits {
        typedef typename T::TypeCategory TypeCategory;
    };
    
    template<typename T>
    struct TypeTraits<T*> {
        typedef TypeOneTag TypeCategory;
    };
    
    //4,建立一组重载函数(身份像劳工)或函数模板,彼此间的差异只在于各自的traits参数
    void doSomething(TypeOneTag) {
        cout << "TypeOneTag" << endl;
    }
    
    void doSomething(TypeTwoTag) {
        cout << "TypeTwoTag" << endl;
    }
    
    void doSomething(TypeThreeTag) {
        cout << "TypeThreeTag" << endl;
    }
    
    //5,建立一个控制函数(身份像工头)或函数模板,它调用上述那些“劳工函数”并传递traits class所提供的信息
    template<typename T>
    void test(T t) {
        doSomething(typename TypeTraits<T>::TypeCategory());
    }
    
    //测试
    int main(){
        ClassOne one; test(one);       //TypeOneTag
        ClassTwo two; test(two);       //TypeTwoTag
        ClassThree three; test(three); //TypeThreeTag
        ClassFour four; test(four);    //TypeThreeTag,继承关系带来的一项红利,这也是public继承带来的部分好处
        int *pointer; test(pointer);   //TypeOneTag
    
        return 0;
    }
    

    参考:《Effective C++》、《STL源码剖析》。

  • 相关阅读:
    高效出去List集合和数组中的重复元素
    各进制间转换总结
    java集合应用类
    禁止键盘上的刷新键F5等
    Map迭代
    java 过滤字符串方法实现
    java 跟 咖啡的关系
    插件jfreechart+shh实现树状图 柱状图 折线图
    Struts2利用iText导出word文档(包含表格)
    request.getRequestURI() 、request.getRequestURL() 、request.getContextPath()、request.getServletPath()区别
  • 原文地址:https://www.cnblogs.com/shuaihanhungry/p/5765541.html
Copyright © 2020-2023  润新知