Я не верю, что вы можете сделать это напрямую с помощью shared_ptr API.
Если Lib :: SomeClass является интерфейсом / абстрактным базовым классом, вы можете использовать Decorator . Идея состояла бы в том, чтобы определить класс, подклассы которого Lib::SomeClass
, содержат shared_ptr<Lib::SomeClass>
и std::ofstream*
, и все методы которого перенаправляются в соответствующий метод содержащегося shared_ptr. Деструктор декоратора, однако, удалит содержащийся ofstream
(или вы можете сохранить его в каком-то контейнере RAII, например scoped_ptr
). Так что это будет экземпляр Decorator, который вы передали в appendWriter. Вот эскиз:
class SomeClassDecorator : public Lib::SomeClass
{
public:
SomeClassDecorator(shared_ptr<Lib::SomeClass> p, std::ofstream* stream)
: p_(p), stream_(stream)
{}
virtual int MethodOfSomeClass(int x) {
return p_->MethodOfSomeClass(x);
}
private:
shared_ptr<Lib::SomeClass> p_;
scoped_ptr<std::ofstream> stream_;
};
std::ofstream* out = new std::ofstream();
...
shared_ptr<Lib::SomeClass> writer = Library.createWriter(out);
shared_ptr<Lib::SomeClass> wrapper(new SomeClassDecorator(writer, out));
Library.appendWriter(wrapper);