Я проектировал классы, все следуют идиомы, что их общий тип указателя доступен в их имен, используя такой код:Получение типа производного класса во время компиляции в C++
class ClassName
{
public:
typedef std::shared_ptr<ClassName> ptr;
}
делает возможным чтобы написать такой код:
ClassName::ptr p=std::make_shared<ClassName>();
Теперь я хотел бы включить этот код в базовый класс. Это позволит мне магически добавить поддержку weak_ptr только в одном месте и укажет, какие классы соответствуют этому протоколу, и, как правило, упрощает создание возможностей.
Я вынужден использовать шаблоны?
Один из способов - следовать подходу enable_shared_from_this <>.
template <typename T>
class SmartPointer
{
public:
typedef std::shared_ptr<T> ptr;
typedef std::weak_ptr<T> wptr;
}
позволяет мне определить классы, как это:
class ClassName:public SmartPointer<ClassName>
...
но меня поражает, как неуклюжий, чтобы указать ClassName в качестве параметра шаблона. То, что я хотел бы сделать, это быть в состоянии идентифицировать тип производного класса во время компиляции, подставляя в течение derivedClassType() ниже:
class SmartPointer
{
public:
typedef std:shared_ptr<derivedClassType()> ptr;
typedef std:weak_ptr<derivedClassType()> wptr;
}
class ClassName: public SmartPointer
...
кажется, что компилятор должен знать, что информация во время компиляции своего рода подразумеваемый шаблонный параметр ... Это имеет дополнительное преимущество, гарантируя, что тип, на который делается ссылка, является производным классом, а не базовым классом.
Есть ли синтаксис, который сделал бы это возможным?
№. – Rapptz
Почему? 'auto p = std :: make_shared();' проще и не требует какого-либо из того, что вы делаете. –
И, что интересно, компилятор не знает эту информацию во время компиляции, потому что «SmartPointer» не имеет базового класса. Это _is_ базовый класс. –