Я не могу понять, как вы собираетесь использовать эту иерархию. Если вы собираетесь сделать что-то вроде этого:
CommandBase * cb = new CommandGlobal<int>();
тогда что вы положите в свой код для типа ?? ниже:
??type?? result = cb->Execute();
И если вы собираетесь это сделать:
CommandGlobal<int> cg;
int result = cg.Execute();
тогда зачем вообще базовый класс?
В любом случае, вы также можете проверить, что Execute возвращает экземпляр Boost.Any , так как и базовый класс, и подклассы будут возвращать экземпляры одного типа. Затем вы можете в любой момент передать результат нужному типу на сайте вызова, предполагая, что вы сможете выяснить, какой у вас реальный подкласс CommandBase.