//: C05:Sortable.h // Template specialization. #ifndef SORTABLE_H #define SORTABLE_H #include <cstring> #include <cstddef> #include <string> #include <vector> using std::size_t; template<class T> class Sortable : public std::vector<T> { public: void sort(); }; template<class T> void Sortable<T>::sort() { // A simple sort for(size_t i = this->size(); i > 0; --i) for(size_t j = 1; j < i; ++j) if(this->at(j-1) > this->at(j)) { T t = this->at(j-1); this->at(j-1) = this->at(j); this->at(j) = t; } } // Partial specialization for pointers: template<class T> class Sortable<T*> : public std::vector<T*> { public: void sort(); }; template<class T> void Sortable<T*>::sort() { for(size_t i = this->size(); i > 0; --i) for(size_t j = 1; j < i; ++j) if(*this->at(j-1) > *this->at(j)) { T* t = this->at(j-1); this->at(j-1) = this->at(j); this->at(j) = t; } } // Full specialization for char* // (Made inline here for convenience -- normally you would // place the function body in a separate file and only // leave the declaration here). template<> inline void Sortable<char*>::sort() { for(size_t i = this->size(); i > 0; --i) for(size_t j = 1; j < i; ++j) if(std::strcmp(this->at(j-1), this->at(j)) > 0) { char* t = this->at(j-1); this->at(j-1) = this->at(j); this->at(j) = t; } } #endif // SORTABLE_H ///:~
Listado 6.29. C05/Sortable.h
//: C05:Sortable.cpp //{-bor} (Because of bitset in Urand.h) // Testing template specialization. #include <cstddef> #include <iostream> #include "Sortable.h" #include "Urand.h" using namespace std; #define asz(a) (sizeof a / sizeof a[0]) char* words[] = { "is", "running", "big", "dog", "a", }; char* words2[] = { "this", "that", "theother", }; int main() { Sortable<int> is; Urand<47> rnd; for(size_t i = 0; i < 15; ++i) is.push_back(rnd()); for(size_t i = 0; i < is.size(); ++i) cout << is[i] << ' '; cout << endl; is.sort(); for(size_t i = 0; i < is.size(); ++i) cout << is[i] << ' '; cout << endl; // Uses the template partial specialization: Sortable<string*> ss; for(size_t i = 0; i < asz(words); ++i) ss.push_back(new string(words[i])); for(size_t i = 0; i < ss.size(); ++i) cout << *ss[i] << ' '; cout << endl; ss.sort(); for(size_t i = 0; i < ss.size(); ++i) { cout << *ss[i] << ' '; delete ss[i]; } cout << endl; // Uses the full char* specialization: Sortable<char*> scp; for(size_t i = 0; i < asz(words2); ++i) scp.push_back(words2[i]); for(size_t i = 0; i < scp.size(); ++i) cout << scp[i] << ' '; cout << endl; scp.sort(); for(size_t i = 0; i < scp.size(); ++i) cout << scp[i] << ' '; cout << endl; } ///:~
Listado 6.30. C05/Sortable.cpp