[2018年5月30號]C++ primer 課後練習 第十六章 模版與泛型程式設計
阿新 • • 發佈:2019-01-06
16.17
當class和typename同在模版引數列表中時,兩者並無不同(P580),但是當函式返回型別是模版內定義的型別成員時,必須使用typename,.用來區分是否是static成員
16.18
a.
template <typename T, typename U,typename V>
void f1(T,U,V);
b.
template <typename T>
T f2(T& i){
}
C.
template <typename T> inline T foo(T,unsigned int*);
d.缺少返回型別符
template <typename T> void f4(T,T){ }
e.typedef char Ctype 會被忽略
typedef char Chartype;
template <typename Ctype> Ctype f5(Ctype a){
return a;
}
16.19
16.20template <typename T> void printContainer(T & con){ for(typename T::size_type i = 0 ; i != con.size(); i++){ cout << con[i] << ends; } cout <<endl; } int main() { vector<int> vecI = { 1,2,3,4,5,6,7,8,9 }; vector<char> vecC = { 'a','b','c','d' }; printContainer(vecI); printContainer(vecC); for (;;); return 0; }
template <typename T> void printContainerIterator(T & con) { for (typename T::iterator it = con.begin(); it != con.end(); it++) { cout << *it << ends; } cout << endl; } int main() { vector<int> vecI = { 1,2,3,4,5,6,7,8,9 }; vector<char> vecC = { 'a','b','c','d' }; printContainerIterator(vecI); printContainerIterator(vecC); for (;;); return 0; }
16.21
class DebugDelete {
public:
DebugDelete(ostream& os = std::cerr) :os(os) {}
template<typename T>
void operator()(T * p) {
os << "delete p " << endl;
delete p;
}
private:
ostream & os;
};
16.22
class QueryResult;
using line_no = vector<string >::size_type;
class TextQuery {
public:
TextQuery(ifstream&);
TextQuery(const TextQuery& tq) :file(new StrVec(*tq.file), DebugDelete()) {
for (auto it : tq.wm) {
wm[it.first].reset(new set<line_no>(it.second->begin(), it.second->end()), DebugDelete());
}
};
TextQuery(ifstream& ifs, const set<int > setInt) :file(new StrVec()) {
string lineStr, word;
while (getline(ifs, lineStr))
{
file->push_back(lineStr);
int lineCount = file->size();
if(setInt.find(lineCount) == setInt.end()){
continue;
}
istringstream ist(lineStr);
while (ist >> word)
{
shared_ptr<set<line_no>>& line = wm[word];
if (!line) {
line.reset(new set<line_no>, DebugDelete());
}
line->insert(lineCount);
}
}
};
//int getSize()const { return file->size(); };
//void clear()const { file->clear(); };
QueryResult query(const string &)const;
private:
shared_ptr<StrVec> file;
map<string, shared_ptr<set<line_no>>> wm;
};
TextQuery::TextQuery(ifstream & ifs) :file(new StrVec(), DebugDelete()) {
string lineStr, word;
while (getline(ifs, lineStr))
{
file->push_back(lineStr);
int lineCount = file->size();
istringstream ist(lineStr);
while (ist >> word)
{
shared_ptr<set<line_no>>& line = wm[word];
if (!line) {
line.reset(new set<line_no>, DebugDelete());
}
line->insert(lineCount);
}
}
}
16.23在智慧指標釋放的時候進行呼叫結果也是如此,作用域結束後釋放指標時,呼叫了函式物件
16.24
template <typename T>
template <typename BT>
Blob<T>::Blob(BT begin, BT end) :data(make_shared<vector<T>>(begin, end)) {
}