1. 程式人生 > >[2018年5月30號]C++ primer 課後練習 第十六章 模版與泛型程式設計

[2018年5月30號]C++ primer 課後練習 第十六章 模版與泛型程式設計

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

template <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;
}
16.20
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)) {

}