Другая возможность: использовать агрегацию. Тогда вы не будете напрямую предоставлять файл boost.variant пользователям библиотеки, предоставляя вам возможность большей свободы для будущих улучшений, и можете значительно упростить некоторые задачи отладки.
Общие рекомендации :
Агрегация менее тесно связана, чем наследование, поэтому лучше по умолчанию, за исключением того, что вы знаете вариант использования, в котором вы явно хотите передать экземпляр вашего объекта уже существующим функциям только с вариантами. И даже если базовый класс должен был быть разработан с учетом наследования.
Пример агрегации для вашей проблемы :
Насколько я понимаю, свободные функции уже существуют, и берут вариант. Просто определите класс с единственным членом данных варианта и предоставьте открытые функции-члены, которые ничего не делают, но вызывают уже существующие свободные функции с вариантом члена, как
class variant_wrapper {
boost::variant<A,B> m_variant;
public:
variant_wrapper(...) : m_variant(...) {} // whatever c_tor you need.
void f() { f(m_variant); }
};
Используя этот подход, вы абстрагируете тот факт, что вы используете boost.variant для своей реализации (что вы уже делаете с помощью typedef для пользователей библиотеки), давая вам возможность позже изменить это (для оптимизации или расширения функций или что угодно), вы можете решить сделать значения неизменяемыми, использовать более простой подход для отладки доступа к вашим алгоритмам и т. д. и т. д.
Недостаток агрегации состоит в том, что вы не можете просто передать оболочку static_visitor, но поскольку ваши пользователи не должны знать, что существует вариант, и вы знаете, что нужно просто передать переменную-член, я не вижу большой проблемы здесь.
Финальная напыщенная речь:
C ++ не является Java. Вам нужно исправить пользователей библиотеки ...
Что бы вы хотели иметь, это методы расширения C #; таких вещей не существует в C ++. Тем не менее, я бы не переопределение / реализация-копия boost.variant (бремя обслуживания), и я бы не наследовать от него. По возможности используйте агрегацию.