Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class FileData{ protected: FileData(){}; virtual ~FileData(){} virtual void save(std::ofstream& output) = 0; virtual void load(std::ifstream& input) = 0; public: template< class T > static void saveArray(std::vector<T>& array, std::ofstream& output){ size_t size = array.size(); output.write((char*)&size,sizeof(size)); if(array.size() > 0){ for(size_t i = 0;i < array.size();i++){ //if (ist die save Funktion vorhanden) //array[i].save(output); //else output.write((char*)&array[i],sizeof(array[i])); } } } //das selbe noch mal für die static void loadArray(...) Funktion }; |
Zitat von »"kiba"«
Und wie soll ich das machen :oops:
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <iostream> //------------------------------------------------------------------------------ struct Test { void save() const { std::cout << "Save" << std::endl; } }; //------------------------------------------------------------------------------ template<typename T> struct supports_save { static const bool value = false; }; // Spezialisierung für Test, da es save unterstützt template<> struct supports_save<Test> { static const bool value = true; }; //------------------------------------------------------------------------------ template<bool SupportsSave> struct saver { template<typename T> static void doSave( const T& ref ); }; template<bool SupportsSave> template<typename T> void saver<SupportsSave>::doSave( const T& ref ) { std::cout << "Doesn't support save. Value is " << ref << std::endl; } template<> template<typename T> void saver<true>::doSave( const T& ref ) { ref.save(); } //------------------------------------------------------------------------------ template<typename T> void save( const T& ref ) { // hier wird entschieden ob save verfügbar ist oder nicht und dann die // entsprechende Methode der Hilfsklasse saver aufgerufen saver<supports_save<T>::value>::doSave(ref); } //------------------------------------------------------------------------------ int main() { int i = 0; Test test; save(i); save(test); return 0; } |
Zitat von »"kiba"«
ahhh ok , noch eine frage gibts da ein möglichkeit ,das wenn man die Klasse FileData vererbt hat, das der Wert von supports_save<>::value automatisch
auf true gesetzt wird.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <iostream> #include <boost/type_traits/is_base_of.hpp> //------------------------------------------------------------------------------ struct supports_save_tag {}; struct Test: private supports_save_tag // Ob die Vererbung private ist, ist eigentlich egal, aber da es sich um // ein Tag handelt wäre es falsch zu sagen Test ist ein supports_save_tag... { void save() const { std::cout << "Save" << std::endl; } }; struct AnotherTest: public Test { void save() const { std::cout << "I can also save me..." << std::endl; } }; //------------------------------------------------------------------------------ // ... gleich wie im vorigen post ... //------------------------------------------------------------------------------ template<typename T> void save( const T& ref ) { // hier wird entschieden ob save verfügbar ist oder nicht und dann die // entsprechende Methode der Hilfsklasse saver aufgerufen saver<boost::is_base_of<supports_save_tag,T>::value>::doSave(ref); } //------------------------------------------------------------------------------ int main() { int i = 0; Test test; AnotherTest test2; save(i); save(test); save(test2); return 0; } |
Werbeanzeige