Ну, то, что у вас сейчас есть, выглядит довольно солидно для меня. Единственная проблема, которую я вижу, заключается в том, что у вас будет только Base*
, доступный во время выполнения, поскольку одна функция может возвращать только 1 тип. Чтобы разрешить многостраничный возврат без указания дополнительного параметра, вы можете подделать функцию следующим образом:
// if employed as a free function
class getOb{
DerivedType _type;
public:
getOb(DerivedType type)
: _type(type) {}
template<class T>
operator T*() const{
Base* ptr;
// fetch correct pointer from wherever
// using _type, if non-existant use 0
return (T*) ptr;
}
};
Использование как
Derived1* pd = getOb(DERIVED_TYPE_1);
assert(pd != 0);
Параметр передается в конструктор, а фактическое тело функции лежит в операторе преобразования. Конечно, это выглядит хорошо только как отдельно стоящая функция, поэтому вот как это будет выглядеть, если вы захотите реализовать ее как функцию-член
class GetObClass{
mutable DerivedType _type;
public:
GetObClass& operator()(DerivedType type) const{
_type = type;
return *this;
}
// template conversion operator as before
};
Использование как
class Container{
public:
const GetObClass getOb;
};
Container c;
Derived1* pd = c.getOb(DERIVED_TYPE_1);
assert(pd != 0);