Re[32]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 09.07.23 18:42
Оценка: 12 (1)
Здравствуйте, Shmj, Вы писали:

S>Хотел еще узнать, знаете ли вы как оно внутри работает?

S>Срабатывает static_assert в операторе (). Но как-то не увидел где вызывается этот оператор — скобок, как сделать мин. функционал, который приведет к тому же эффекту?

Ну вот тебе эскиз реализации. Понятное дело, что все очень упрощенно, это лишь для понимания принципа, как оно там внутри устроено:

http://coliru.stacked-crooked.com/a/efb3907d3c848173
(Поправил: перенес static_assert из деструктора умного указателя в класс делетера)

#include <utility>

template <typename T>
struct MyDeleter
{
   void operator()(T* t) const
   {
       static_assert(sizeof(T), "Incomplete type");
       delete t;
   }
};

template <typename T, typename DeleterT = MyDeleter<T>>
class MySmartPtr
{
public:

   MySmartPtr() = default;
   explicit MySmartPtr(T* p, DeleterT deleter = {})
      : m_p(p), m_deleter(std::move(deleter)) {}

   T& operator * () const { assert(m_p); return *m_p; }
   T* operator -> () const { assert(m_p); return m_p; }
   explicit operator bool() const { return m_p != nullptr; }

   ~MySmartPtr()
   {
      if (m_p)
      {
         m_deleter(m_p);
      }
   }

private:
   T* m_p{};
   DeleterT m_deleter{};
};

class Class1
{
public:

   Class1(){}
   explicit Class1(int);
   ~Class1();

private:

   class Impl;

   MySmartPtr<Impl> m;
};

int main()
{
}


Как дополнить недостающие члены класса Class1 и поэкспериментировать с переносом конструктора, ты знаешь.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 10.07.2023 7:41 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.