Я недавно пробовал shared_ptr и наткнулся на немного странный случай. То, что я хочу, это функция-член шаблона, которая способна возвращать shared_ptr своего производного типа. Я использую Visual Studio 2010, у которой есть доступ к некоторым новым стандартам c ++ 0x, но я предполагаю, что boost shared_ptr ведет себя аналогично.
Это работало нормально с голыми указателями. Я только что вернул dynamic_cast (это). Однако я немного озадачен тем, что даже при использовании enable_shared_from_this объект пытается удалить себя после вызова функции (что плохо). Я, вероятно, подхожу к этому неправильно, но я хотел бы решить, как смоделировать эквивалент пустого указателя (который работал) из следующего (это код, с которым у меня проблемы).
//assume we have a virtual function as well.
class BaseClass : public std::enable_shared_from_this<BaseClass>
{
....
template<typename DerivedClass>
std::shared_ptr<DerivedClass> BaseClass::getThis(){
//I had some assert code here to ensure typeid matched
return std::dynamic_pointer_cast<DerivedClass>(shared_from_this());
}
}
edit : Кажется, функция работает правильно, проблема была в том, как я ее использовал. Это плохо, например, сделать следующее:
std::shared_ptr<DerivedClass> p = std::make_shared<DerivedClass>();
p->getType<DerivedClass>->someOtherFunctionOnlyInTheDerivedClass();
Это не проблема:
std::shared_ptr<BaseClass> p = std::make_shared<DerivedClass>();
p->getType<DerivedClass>->someOtherFunctionOnlyInTheDerivedClass();
Я не совсем уверен, если это проблема с преобразованием в тот же тип, или проблема подсчета ссылок. В любом случае, я делал что-то глупое, и это ломалось, избегая ненужного вызова getType в этот момент, кажется, работает нормально во всех остальных случаях, когда я его использую. Может быть, кто-то может точно объяснить, что приводит к разрыву первого примера с работающим вторым примером. Я назначу очки этому ответу.