У меня есть класс Foo, который я не реализую напрямую, а обертываю внешние библиотеки (например, FooXternal1 или FooXternal2 ). Один из способов, который я видел для этого, - использовать директивы препроцессора как
#include "config.h"
#include "foo.h"
#ifdef _FOOXTERNAL1_WRAPPER_
//implementation of class Foo using FooXternal1
#endif
#ifdef _FOOXTERNAL2_WRAPPER_
//implementation of class Foo using FooXternal2
#endif
и config.h используется для определения этих флагов препроцессора (_FOOXTERNAL1_WRAPPER_ и _FOOEXTERNAL2_WRAPPER_). У меня сложилось впечатление, что это не одобряется сообществом программистов C++, потому что он использует директивы препроцессора, его сложно отлаживать и т. д. Кроме того, он не допускает параллельного существования обеих реализаций.
Я подумал о том, чтобы сделать Foo базовым классом и наследовать от него, чтобы обе реализации могли существовать параллельно друг с другом. Но столкнулся с двумя проблемами:
- Чисто виртуальные функции:
cannot instatiate an object of type 'Foo', которые мне нужны во время использования. - Виртуальные функции рискуют запустить объект без (надлежащей) реализации.
Я что-то пропустил? Есть ли более чистый способ сделать это?
РЕДАКТИРОВАТЬ: Подводя итог, можно сказать, что существует 3 (.5 ?!) способа сделать обертку - 2 (.5) предоставляются пакетом со льдом, а последний - Сергеем. 1- Использовать фабричные методы 2- Использовать директивы препроцессора 2.5- Используйте makefile или IDE для эффективного выполнения работы директив препроцессора 3.5- Используйте шаблоны, предложенные Сергеем
Я работаю над встроенной системой, где ресурсы ограничены, я решил использовать template<enum = default_library> со специализацией шаблона. Это легко понять для более поздних пользователей; по крайней мере я так думаю