CFileSource и CDatabaseSource - два возможных алгоритма, которые пользователь
можно выбрать один для создания объекта CustomerData. Вы можете рассмотреть
getCustomerDataSource как фабричный метод, который возвращает shared_ptr из
CustomerData <> на основе переданного параметра.
Похоже, ваше недоразумение заключается в следующем: между двумя экземплярами одного и того же шаблона нет никакой связи, кроме того, что они являются экземплярами одного и того же шаблона.
Рассмотрим:
template<typename T>
struct Foo{};
??? bar(bool x) {
if (x) return Foo<int>();
return Foo<double>();
}
Нет типа, который вы могли бы поставить вместо ???
, потому что Foo<int>
и Foo<double>
никак не связаны. Они являются воплощениями одного и того же tempalte, но это все.
Возможно, вы хотите что-то вроде этого:
struct Moo_base {};
template <typename T>
struct Moo : Foo_base {};
Потому что теперь Moo<int>
и Moo<double>
можно передавать через std::shared_ptr<Moo_base>
.