Проблема специфическая, но решение открыто. Я одинокий программист, который хочет поделиться идеями с коллегами-программистами.
У меня есть оболочка для математической библиотеки. Оболочка обеспечивает систему единообразным интерфейсом, позволяя мне включать / выключать математические библиотеки для разных платформ. Оболочка содержит один член, так что для моего класса-обертки Matrix4x4 структура api_matrix_4x4 является единственным членом обертки.
Моя текущая целевая платформа имеет изящную небольшую оптимизированную библиотеку, для некоторых из этих изящных функций требуется массив в стиле C встроенного члена оболочки, в то время как мои функции-оболочки для этих функций математического API не хотят показывать этот член введите для остальной части системы. Итак, у нас есть коллекция оберток (ссылка / указатель на), идущая в функцию, и члены оберток, необходимые в коллекции внутри функции, чтобы их можно было передавать в математический API.
Я преимущественно использую C ++, включая функции C ++ 11, и также могу работать в стиле C. В идеале я хочу решение без исключений, чтобы избежать как можно большего, если не всех, динамического распределения. Мои функции-обертки могут использовать стандартные библиотечные массивы или векторы или указатели в стиле C для массивов в качестве параметров и всего, что необходимо внутри, просто без динамического приведения (информация о типе во время выполнения).
1) Могу ли я привести пользовательскую структуру / класс, содержащий одну пользовательскую структуру, к пользовательской структуре? Если да, то как насчет того, чтобы это была стандартная коллекция из них? Я думаю о нарезке шрифтов здесь.
2) Возможно, вы воспользуетесь шаблоном для маскировки типа, передаваемого функции, хотя реализация может действовать только на один тип (в зависимости от используемого математического API), или такое использование шаблонов считается плохим?
3) Можете ли вы придумать изящное решение, возможно, включающее семантику / перемещение swaps / move? Если да, пожалуйста, помогите, рассказав мне об этом.
4) Или я смирился с очевидным: перебираю одну коллекцию, вынимаю член в другую, а затем использую это для функции API?
Пример того, что я делаю с помощью структуры-оболочки и сигнатуры функции-оболочки, и пример того, чего я пытаюсь избежать, дано реализацией функции:
struct Vector3dWrapper
{
API_Specific_Vector_3d m_api_vector_3d;
inline void operation_needing_vector_3d_wrappers(std::vector<Vector3d>& vectors)
{
// Now need a collection of API_Specific_Vector_3ds
try
{
std::Vector<API_Specific_Vector_3d> api_vectors;
api_vectors.reserve(vectors.size());
for( auto vectors_itr = vectors.begin(); vectors_itr != vectors.end(); ++vectors)
{
// fill each Vector3d.m_api_vector_3d into api_vectors
}
}
catch(std::bad_alloc &e)
{
// handle... though in reality, try/catch is done elsewhere in the system.
}
// Signature is API_Multiply_Vectors_With_Matrix_And_Project(API_Specific_Vector_3d* vectors, size_t vector_count)
API_Multiply_Vectors_With_Matrix_And_Project(&api_vectors, api_vectors.size());
}
};