首页 > 代码库 > 普通(非模板)类的成员模板
普通(非模板)类的成员模板
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;};
普通(非模板)类的成员模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。