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;
    };
  • 相关阅读:
    程序员高效学习
    红黑树(平衡操作详解)
    【设计模式】JDK源码中用到的设计模式
    pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')错误处理
    UPC:ABS
    洛谷:P1182:数列分段`Section II`
    python:数据库连接操作入门
    2018百度之星资格赛:1002:子串查询
    Educational Codeforces Round 48 (Rated for Div. 2)——A. Death Note ##
    python:pip命令使用
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3948762.html
Copyright © 2011-2022 走看看