Сообщение Re[32]: Ошибка, если конструктор определен в h-файле (этюд?) от 09.07.2023 18:42
Изменено 10.07.2023 7:41 rg45
Re[32]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>Хотел еще узнать, знаете ли вы как оно внутри работает?
S>Срабатывает static_assert в операторе (). Но как-то не увидел где вызывается этот оператор — скобок, как сделать мин. функционал, который приведет к тому же эффекту?
Ну вот тебе эскиз реализации. Понятное дело, что все очень упрощенно, это лишь для понимания принципа, как оно там внутри устроено:
http://coliru.stacked-crooked.com/a/86ebd6962f7b38c1
Как дополнить недостающие члены класса Class1 и поэкспериментировать с переносом конструктора, ты знаешь.
S>Хотел еще узнать, знаете ли вы как оно внутри работает?
S>Срабатывает static_assert в операторе (). Но как-то не увидел где вызывается этот оператор — скобок, как сделать мин. функционал, который приведет к тому же эффекту?
Ну вот тебе эскиз реализации. Понятное дело, что все очень упрощенно, это лишь для понимания принципа, как оно там внутри устроено:
http://coliru.stacked-crooked.com/a/86ebd6962f7b38c1
#include <utility>
template <typename T>
struct MyDeleter
{
void operator()(T* t) const { 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()
{
static_assert(sizeof(T), "Incomplete type");
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 и поэкспериментировать с переносом конструктора, ты знаешь.
Re[32]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>Хотел еще узнать, знаете ли вы как оно внутри работает?
S>Срабатывает static_assert в операторе (). Но как-то не увидел где вызывается этот оператор — скобок, как сделать мин. функционал, который приведет к тому же эффекту?
Ну вот тебе эскиз реализации. Понятное дело, что все очень упрощенно, это лишь для понимания принципа, как оно там внутри устроено:
http://coliru.stacked-crooked.com/a/efb3907d3c848173
(Поправил: перенес static_assert из деструктора умного указателя в класс делетера)
Как дополнить недостающие члены класса Class1 и поэкспериментировать с переносом конструктора, ты знаешь.
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 и поэкспериментировать с переносом конструктора, ты знаешь.