zoukankan      html  css  js  c++  java
  • 普通(非模板)类的成员模板

    16.21 编写你自己的DebugDelete版本。

    #include<iostream>
    #include<new>
    using namespace std;
    
    class DebugDelete
    {
    public:
        DebugDelete(ostream &s=cerr):os(s) {}
        template <typename T>
        void operator()(T *p) const
        {
            os<<"deleting unique_ptr "<<endl;
            delete p;
        }
    private:
        ostream &os;
    };
    
    int main()
    {
        double *p=new double;
        DebugDelete d;
        d(p);
        int *ip=new int;
        DebugDelete()(ip);
        return 0;
    }

    16.22 修改TextQuery程序,令shared_ptr成员使用DebugDelete作为它们的删除器。

    TextQuery.h

    #ifndef TEXTQUERY_H
    #define TEXTQUERY_H
    #include<iostream>
    #include<string>
    #include<fstream>
    #include<vector>
    #include<memory>
    #include<map>
    #include<set>
    #include<new>
    #include"DebugDelete.h"
    using namespace std;
    class QueryResult;
    class TextQuery
    {
    public:
        using line_no=vector<string>::size_type;
        TextQuery(ifstream&);
        QueryResult query(const string&) const;
        ~TextQuery()
        {
            //DebugDelete()(new vector<string>);
            cout<<"destructing...."<<endl;
        }
    private:
        shared_ptr<vector<string>> file;
        map<string,shared_ptr<set<line_no>>> wm;
    };
    #endif // TEXTQUERY_H

    TextQuery.cpp

    #include"TextQuery.h"
    #include"QueryResult.h"
    #include<sstream>
    TextQuery::TextQuery(ifstream& is):file(new vector<string>,DebugDelete())
    {
        string text;
        while(getline(is,text))
        {
            file->push_back(text);
            int n=file->size()-1;
            string word;
            istringstream line(text);
            while(line>>word)
            {
                auto &lines=wm[word];
                if(!lines)
                    lines.reset(new set<line_no>);
                lines->insert(n);
            }
        }
    }
    
    QueryResult TextQuery::query(const string& sought) const
    {
        static shared_ptr<set<line_no>> nodata(new set<line_no>);
        auto loc=wm.find(sought);
        if(loc!=wm.end())
            return QueryResult(sought,loc->second,file);
        else
            return QueryResult(sought,nodata,file);
    }

    DebugDelete.h

    #include<iostream>
    #include<new>
    using namespace std;
    
    class DebugDelete
    {
    public:
        DebugDelete(ostream &s=cerr):os(s) {}
        template <typename T>
        void operator()(T *p) const
        {
            os<<"deleting shared_ptr "<<endl;
            delete p;
        }
    private:
        ostream &os;
    };
  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3948762.html
Copyright © 2011-2022 走看看