Я использую PIMPL, чтобы скрыть детали реализации моей библиотеки от конечного пользователя. Также хочу захватить все сторонние зависимости библиотеки внутри себя; так что мне не нужно, чтобы конечный пользователь связывал их для использования моей библиотеки.
Интерфейс
//// core.h (the interface)
namespace N
{
enum class priority { ... };
enum class type { ... }
class event_base {
... // getting queued time, priority, name, type etc;
private:
priority m_priority;
type m_type;
};
typedef std::shared_ptr<event_base> p_evt;
class server_backend
{
public:
server_backend(const uint32_t &port = 10100);
~server_backend();
bool try_push(p_evt p);
size_t get_size_evt_bus();
void dump_evt_bus();
private:
struct impl;
std::unique_ptr<impl> p_impl;
}
}
Детали реализации
//// core.cpp
#include "backend.h"
using namespace N;
class server_backend::impl
{
impl(const uint32_t& port)
:_bimpl(std::make_unique<backendimpl>(port))
{}
bool try_push(p_evt p)
{
return true;
}
size_t get_size_evt_bus()
{
return 0;
}
void dump_evt_bus()
{ }
private:
std::unique_ptr<backendimpl> _bimpl;
}
server_backend::server_backend()
:p_impl(std::make_unique<impl>(port))
{}
server_backend::~server_backend() = default;
/// call impl functions from server_backend public functions
Моя реализация создает экземпляр класса глубже в библиотеке. Этот класс действительно содержит типы данных из сторонних библиотек.
//backend.h
class backendimpl final
{
backend(const uint32_t &port);
~backendimpl();
bool try_push(p_evt p);
size_t get_size_evt_bus();
void dump_evt_bus();
// other public functions
private:
// private members (some from 3rd party libs)
// private functions
}
Я пытаюсь скрыть эти сторонние библиотеки от конечного пользователя. Но я обнаружил, что когда я создаю клиентское приложение (в основном, просто заглушку CTest), мне действительно нужно включать сторонние библиотеки вместе с моей библиотекой. Логично предположить, что проблема возникает, когда я включаю более глубокий заголовок класса в свою реализацию интерфейса; но я не вижу выхода.
Кто-нибудь может помочь?