У меня следующая проблема:
Мне нужно разработать статическую библиотеку (* .lib) в Visual C ++ для эффективного численного расчета.
Я начал определять новый класс шаблонов «Матрица» и прочитал, что наилучшая эффективность может быть достигнута с помощью шаблонов выражений.
Но я также прочитал (и я испытал это), что не могу заключить шаблоны выражений в статическую библиотеку, потому что вам нужно явно определить все комбинации.
Так, например, если я хочу сделать в новом проекте:
Matrix<int> M_A, M_B, M_C, M_D;
M_C = M_A + M_B + 2 * M_D;
M_C = 2 * M_B;
M_C = M_A + 2 * M_B;
импортируя мой * .lib файл, я должен istantiate в моих статических библиотеках 3 различных комбинации, чтобы позволить равенства M_C = Expression.
Есть ли метод или «лучшая практика» для упрощения istantiation explixit в статической библиотеке? Или есть альтернатива шаблонам выражений, обеспечивающая такую же эффективность без проблем с экспортом?
Для пояснения мне нужно сохранить возможность компактной записи типа: M_C = M_A + M_B + 2 * M_D;
Спасибо.
Ps.
Я добавлю больше деталей, чтобы лучше объяснить:
Если я создаю свою статическую библиотеку, я могу использовать ее во внешнем проекте, но я должен экспортировать
все шаблоны специализации.
шаблон класса __declspec (dllexport) Matrix;
шаблон класса __declspec (dllexport) Matrix;
и так далее…
Проблема в том, что я должен сделать то же самое со всеми возможными выражениями, чтобы разрешить равенства (например, M_A = M_B + M_C).
Я должен экспортировать что-то вроде этого:
шаблон класса LibraryNameSpace :: Matrix const & __thiscall LibraryNameSpace :: Matrix :: operator =, int> (класс LibraryNameSpace :: myExpression, int>);
Без вложения всего кода в файл lib для меня нет проблем: я могу без проблем использовать свою библиотеку. Проблема связана с вложением шаблонов выражений в статические библиотеки. Мне нужно сделать это, чтобы замаскировать код и не дать конечным пользователям возможности его прочитать.
Это то, что вы, вероятно, не должны развивать себя с нуля, если вы делаете это в образовательных целях.
Посмотри на Блиц ++. Согласно его руководству, он компилируется в статическую библиотеку.
Перед разработкой собственной библиотеки линейной алгебры ET вы рассматривали возможность использования существующих?
У вас есть выбор между (без определенного порядка): собственный, полыхать, uBlas а также блиц ++.
Все они являются библиотеками, использующими шаблоны выражений, чтобы избавиться от временных переменных для смешанных матричных / векторных операций, и некоторые из них (Blaze и Eigen) идут на шаг дальше и специализируют шаблоны для конкретных матричных / векторных операций (интеллектуальные шаблоны выражений). Все упомянутые библиотеки разработаны группами (некоторые научные) людей и были отлажены и проверены, и задокументированы в открытых научных публикациях, с использованием вики и т. Д.
Я бы посоветовал рассмотреть вопрос о том, подходит ли здесь повторное наложение колеса из-за сложности темы. Если вы хотите повысить эффективность, самый простой ответ — адаптировать существующую эффективную библиотеку к вашим потребностям.