標準(非テンプレート)クラスのメンバーテンプレート

8514 ワード

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;

};