015
09.02.2007, 12:14 Uhr
stephanw
localhorst
|
Zitat: |
Ansonsten generell zu der Template frage: Generelles Template erstellen und da drin nix implementieren oder was unsinniges (aray groesse 0 aufmachen oder so) templates auf die gewuenschten typen spezialisieren und dort richtig implementieren. - wenn dann nen template mit nem "falschen" typ aufrufst, kennt der entweder deine methoden nicht, oder haut dir gleich ne exception wegen dem unsinnigen um die ohren ....
|
Naja, sowas muss man nicht mal mit derartigen Compile-Time-Assertions machen. Man kann ja auch das Einfügen in den Schrank durch Templates-Klassen machen, die keine automatische Konvertierung haben:
C++: |
class Shoe {};
class S1 : public Shoe {}; class S2 : public Shoe {};
class S5 : public S1 {}; class S8 : public S5 {};
template<class ShoeInserter> class ShoeLocker { public:
void insertShoe( ShoeInserter si ) { shoes_.push_back( si.get() ); }
private: std::vector<Shoe*> shoes_; };
template<class S> class ShoeInserter { public: explicit ShoeInserter( S* s ) : shoe_(s) {} Shoe* get() const { return shoe_; } private: Shoe* shoe_; };
int main() { ShoeLocker< ShoeInserter<S5> > shoeLockerS5; // nur fuer S5 gedacht
S5* s5 = new S5; S1* s1 = new S1;
shoeLockerS5.insertShoe( ShoeInserter<S5>( s5 ) );
shoeLockerS5.insertShoe( ShoeInserter<S1>( s1 ) ); // Fehler // aber shoeLockerS5.insertShoe( ShoeInserter<S5>( static_cast<S5*>(s1) ) ); }
|
Wie man das (ohne dynamic_cast oder andere Laufzeittests) verhindern könnte, ist mir bisher nicht eingefallen ;-) -- Reden ist Schweigen und Silber ist Gold. Dieser Post wurde am 09.02.2007 um 12:17 Uhr von stephanw editiert. |