Коллекция пользовательских структур (оболочка) с одним членом (также пользовательская структура) для коллекции отдельных элементов. - PullRequest
2 голосов
/ 01 апреля 2012

Проблема специфическая, но решение открыто. Я одинокий программист, который хочет поделиться идеями с коллегами-программистами.

У меня есть оболочка для математической библиотеки. Оболочка обеспечивает систему единообразным интерфейсом, позволяя мне включать / выключать математические библиотеки для разных платформ. Оболочка содержит один член, так что для моего класса-обертки 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());
   }

};

1 Ответ

1 голос
/ 01 апреля 2012
  1. Вы можете привести структуру стандартного макета (например, структуру, совместимую с C) к ее первому члену, но какой в ​​этом смысл?Просто получите доступ к первому члену и примените &.

  2. Шаблоны обычно допускают унифицированную параметризацию для набора типов.Вы можете написать шаблон, который создается только один раз, но опять же, который кажется бессмысленным.Что вам действительно нужно, так это отдельная интерфейсная библиотека для каждой платформы.Возможно, шаблоны могут помочь определить общий код, разделяемый между ними.Или вы могли бы сделать то же самое в простом C, установив typedef с до #include.

  3. Решение для чего?Семантика копирования и перемещения по умолчанию должна работать для плоских структур в стиле C, содержащих числа.Что касается глубоких копий, если базовые библиотеки имеют структуры, основанные на указателях, вы должны быть осторожны и реализовать всю семантику, которая вам понадобится.Безопасный ... простой ... по умолчанию ... "отличный" звучит грязно.

  4. Не уверен, что я понимаю, что вы делаете с коллекциями.Вы имеете в виду, что каждая функция требует, чтобы ее параметры были сначала вставлены в общий контейнерный объект?Строительство контейнеров звучит дорого.Ваши функции должны быть максимально параллельны функциям в базовых библиотеках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...