У меня есть что-то вроде этого:
struct D {
virtual void operator() {...};
}
struct D1 : public D {
virtual void operator() {...};
}
struct D2 : public D {
virtual void operator() {...};
}
void foo(D &d) {...};
И так, это нормально, и прекрасно контролирует жизненный цикл моих D:
foo(D());
foo(D1());
foo(D2());
Но я выбираю свой вариант D в нескольких местах, поэтому я хочу простую фабрику:
const D& make_D()
{
// BAD, returning reference to temporary
if(is_tuesday())
return D1();
return D2();
}
Вместо того, чтобы возвращать ссылку на временный объект, я мог бы вернуть объект, но затем я разделил его до базового класса. В качестве альтернативы я мог бы вернуть указатель с моей фабрики, но тогда клиент должен удалить его. Другие, более сложные решения также увеличивают нагрузку на клиента.
Есть ли способ написать что-то вроде
D& d = make_D();
foo(d);
(или даже foo(make_D())
)? Цель состоит в том, чтобы обернуть сложность в различные определения D и в make_D()
так, чтобы такие функции, как foo()
и те, кто вызывает эти функции, не беспокоились об этом.