LINUX.ORG.RU

История изменений

Исправление Gvidon, (текущая версия) :

У меня вот такой вариант завёлся:

#include <iostream>
#include <tr1/memory>

struct MyDeleter
{
  MyDeleter(): del(true) {}

  template <typename T>
  void operator()(T * ptr)
  {
    if (del)
      delete ptr;
  }

  void setDelete(bool d)
  {
    del = d;
  }
private:
  bool del;
};

struct MyClass
{
  MyClass(const std::string &s): str(s) {}
  void say()
  {
    std::cout << str << std::endl;
  }
private:
  std::string str;
};

int main()
{
  MyClass *c_ptr = new MyClass("hello");
  std::tr1::shared_ptr<MyClass> ptr(c_ptr, MyDeleter());
  MyDeleter *deltr = std::tr1::get_deleter<MyDeleter, MyClass>(ptr);
  std::cout << deltr << std::endl;
  if (deltr)
    deltr->setDelete(false);
  ptr.reset();
  c_ptr->say();
}

Исходная версия Gvidon, :

У меня вот такой вариант завёлся:

#include <iostream>
#include <tr1/memory>

struct MyDeleter
{
  MyDeleter(): del(true) {}

  template <typename T>
  void operator()(T * ptr)
  {
    if (del)
      delete ptr;
  }

  void setDelete(bool d)
  {
    del = d;
  }
private:
  bool del;
};

struct MyClass
{
  MyClass(const std::string &s): str(s) {}
  void say()
  {
    std::cout << str << std::endl;
  }
private:
  std::string str;
};

int main()
{
  MyClass *c_ptr = new MyClass("hello");
  std::tr1::shared_ptr<MyClass> ptr(c_ptr, MyDeleter());
  MyDeleter *deltr = std::tr1::get_deleter<MyDeleter, MyClass>(ptr);
  std::cout << deltr << std::endl;
  if (deltr)
    deltr->setDelete(false);
  ptr.reset();
  c_ptr->say();
}
Я же говорил, не надо воспринимать то, что я написал выше, буквально, это только набросок