Средство удаления по умолчанию для shared_ptr для определенного типа - PullRequest
1 голос
/ 14 ноября 2011

Можно ли дать boost::shared_ptr средство удаления по умолчанию для определенного типа (это не delete)?

В настоящее время у меня есть:

// .h
typedef boost::shared_ptr<SomeType> SomeTypePtr;
SomeTypePtr InitPtr(SomeType * p);



// .cpp
struct SomeTypeDeleter { ... };
SomeTypePtr InitPtr(SomeType * p)
{
  return SomeTypePtr(p, SomeTypeDeleter());
}

Я хотел быиспользовать другое средство удаления по умолчанию, поэтому я могу пропустить метод InitPtr и вместо этого использовать

SomeTypePtr(pSomeType);                // uses SomeTypeDeleter
SomeTypePtr(pSomeType, NullDeleter);   // uses specified deleter

Какой лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Вы не можете этого сделать.Средство удаления по умолчанию не является чем-то настраиваемым.Общий указатель с удалением по умолчанию на самом деле меньше (внутри), чем указатель с пользовательским удалением.Вы можете сделать так, чтобы ваша InitPtr функция обеспечивала значение по умолчанию.

1 голос
/ 14 ноября 2011

Лучшим способом была бы простая обертка:

struct some_type_deleter
{
  // ...
};

template<class T>
class some_type_ptr
  : public boost::shared_ptr<T>
{
  typedef boost::shared_ptr<T> base_type;

public:
  template<class U>
  some_type_ptr(U* p)
    : base_type(p, some_type_deleter())
  {
  }

  template<class U, class D>
  some_type_ptr(U* p, D d)
    : base_type(p, d)
  {
  }

  template<class U, class A, class D>
  some_type_ptr(U* p, A a, D d)
    : base_type(p, a, d)
  {
  }
};

Не идеально, но выполняет свою работу.

...