標準(非テンプレート)クラスのメンバーテンプレート
8514 ワード
16.21自分のDebugDeleteバージョンを作成します.
16.22 TextQueryプログラムを修正し、shared_ptrメンバーはDebugDeleteを削除器として使用します.
TextQuery.h
TextQuery.cpp
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 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;
};