Я не знаю, что boost::any
делает для вас, но кроме этого ваши (только, я думаю) варианты: 1) Сделать ConfigurationManager
классом шаблона или 2) сделать ConfigurationManager::getOption
не -virtual, но использует отдельную не шаблонную виртуальную функцию (которая вызывается в getOption
), которая управляет функциональностью, которую вы хотите в своих производных классах. Есть также варианты на 2), такие как включение указателя на объект, который определяет предполагаемую функциональность (не виртуальную) getOption
. Этот объект будет экземпляром класса, который сам является частью иерархии наследования - в основном, паттерна Стратегия. Кажется, сложнее, хотя. Так что в основном я предлагаю
class ConfigurationManager
{
public:
...
template<typename T>
getOption(...);
private:
virtual getOptionSpecial(...) = 0; //Called within getOption
};
Главный ответ на этот SO поток (частично), почему я думаю, что это почти все, что вы можете сделать.