При разработке библиотеки C++ я читал, что плохой практикой является включение стандартных библиотечных контейнеров, таких как std::vector
, в открытый интерфейс (см., Например, Implications of using std::vector in a dll exported function).Безопасное использование контейнеров в интерфейсе библиотеки C++
Что делать, если я хочу выставить функцию, которая принимает или возвращает список объектов? Я мог бы использовать простой массив, но тогда мне пришлось бы добавить параметр count
, что сделает интерфейс более громоздким и менее безопасным. Кроме того, это не помогло бы, если бы я хотел использовать map
, например. Я думаю, что библиотеки, такие как Qt, определяют свои собственные контейнеры, которые безопасны для экспорта, но я бы предпочел не добавлять Qt в качестве зависимости, и я не хочу откатывать свои собственные контейнеры.
Какова наилучшая практика борьбы с контейнерами в интерфейсе библиотеки? Может быть, крошечная реализация контейнера (желательно только один или два файла, которые я могу зайти, с разрешительной лицензией), которые я могу использовать как «клей»? Или существует даже способ сделать std::vector
и т. Д. Безопасным через границы .DLL/.so и с разными компиляторами?
Могу ли я предложить «шаблон функции» вместо «шаблон функции»? :) –