Einige C++ Tips (ist noch in Arbeit)

Problem: DLL-Export von Templates. Annahme wir haben eine Klasse vom typ T und die heiß Matrix (wir wollen hier nicht generalisieren) Also: #ifdef MY_EXPORTS # define MY_EXPORT_API __declspec(dllexport) # define MY_EXPORT_EXT #else # define MY_EXPORT_API __declspec(dllimport) # define MY_EXPORT_EXT extern #endif /** @file Matrix.hpp */ #ifndef MY_MATRIX_HPP #define MY_MATRIX_HPP namespace myspace { template class Matrix { public: Matrix ( int rows, int cols ) { m_data = new T [rows * cols]; m_rows = rows; m_cols = cols; } ~Matrix () { delete[] m_data; } T & at ( int row, int col ) { return m_data[row * m_cols + col]; } Matrix operator + ( const Matrix & matrix ) const { Matrix result( m_rows, m_cols ); for (int r=0; rat(r,c) + matrix.at(r,c); return result; } private: int m_rows; int m_cols; T * m_data; }; // Die nächste (nicht auskommentierte) Zeile ist der Zauberschlüssel. // Hiermit machen wir die spezialisierte Klasse Matrix allen anderen bekannt. // Das ist nähmlich wichtig, das sonst alle die Matrix haben wollen, // eine eigene Instanz erzeugen würden. template class MY_EXPORT_API Matrix; }// namespace #endif Ein wichtiger Schritt ist natürlich die Instanzierung in den eigenen DLL. Das ist in diesem Fall extrem einfach. /** @file Matrix.cpp */ #include "Matrix.hpp" Fertig. Nun ja da werden jetzt viele sagen: "Ich habe aber eine ganz bestimmte Klasse die schneller die daten verarbeiten kann." Das währe z.B. die Addition der Matritzen für T = unsigned char mit SIMD. Was macht man dann... Genau, man implementiert erstmal die spezielle Addition aus. Und das kann sogar in der Matrix.cpp passieren! Ja, genau man muss es nicht im Header machen!!!! Wie geht das?

.