Что должно быть включено в публичные заголовочные файлы библиотеки c ++? - PullRequest
0 голосов
/ 04 ноября 2018

Я создаю небольшую общую библиотеку c ++, в которой есть класс (в заголовочном файле), подобный этому

class Foo {
  ...
  std::optional<some_type> _bar;
  ...
};

Поскольку std::optional - это C ++ 17, любой, кто включает вышеуказанный файл, должен скомпилировать C ++ 17. Однако _bar не является частью общедоступного интерфейса библиотеки. _bar используется только в реализации. Итак, мой вопрос, как я могу предоставить файл заголовка, который только предоставляет открытые методы, но поддерживает мою реализацию C ++ 17? Я надеюсь, что мне не нужно заставлять пользователей библиотеки использовать C ++ 17, верно?

Я также использую CMake для генерации файлов сборки, если это имеет значение.

1 Ответ

0 голосов
/ 05 ноября 2018

Поскольку вы создаете общую библиотеку:

Вы можете определить базовый класс BaseFoo со всеми интерфейсами (чисто виртуальными).

Затем выведите Foo из BaseFoo и добавьте заводскую функцию: getFoo

После этого внедрите Foo в качестве динамической библиотеки и экспортируйте фабричную функцию (__attribute__ ((visibility ("default"))))

Теперь отправьте заголовок BaseFoo с динамической библиотекой (убедитесь, что клиент использует ту же версию libstdc ++).

...