typedef boost :: shared_ptr <MyJob>Ptr; или #define Ptr boost :: shared_ptr - PullRequest
2 голосов
/ 16 июня 2010

Я только начал работать над новой кодовой базой, где каждый класс содержит typedef shared_ptr ( аналогично этому ), например:

typedef boost::shared_ptr<MyClass> Ptr;

Является ли единственной целью сохранить набор текста boost :: shared_ptr?

Если это так, то единственная причина не делать

#define Ptr boost::shared_ptr 

в одном общем заголовке общие проблемы с #define? Тогда вы можете сделать:

Ptr<MyClass> myClass(new MyClass);

, который набирает не больше, чем

MyClass::Ptr myClass(new MyClass);

и сохраняет определение Ptr в каждом классе.

Ответы [ 3 ]

9 голосов
/ 16 июня 2010

Макрос (#define) всегда определяется глобально. Это означает, что каждое использование 'string' Ptr (даже переменной) будет заменено макросом.

typedef может быть помещен в класс, в пространство имен ... так что вы можете лучше контролировать его.

EDIT: Другое преимущество заключается в том, что вы можете использовать разные типы Ptr в разных классах, например,

  • ClassX :: Ptr - это повышение shared_ptr
  • ClassY :: Ptr может быть другим shared_ptr
  • ClassZ :: Ptr может быть простым указателем "Class Z *"

Если эти классы затем используются в шаблонном коде, вы можете использовать T :: Ptr в качестве типа указателя на класс, и шаблон будет использовать наиболее подходящий указатель для класса.

2 голосов
/ 17 июня 2010

Это единственная цель, чтобы сохранить набор текста повышение :: shared_ptr? * * 1002

Да, в значительной степени. Ну, не для того, чтобы сохранить , набрав per se, это улучшить удобочитаемость . Но я думаю, это то, что вы имели в виду.

Сравните их и посмотрите, что вам нравится. Там нет правильного ответа, кроме как знать о проблемах с макросами и беспорядком пространства имен.

boost::shared_ptr<Foo> func (boost::shared_ptr<Foo> a, boost::shared_ptr<Foo> b);

shared_ptr<Foo> func (shared_ptr<Foo> a, shared_ptr<Foo> b);

Ptr<Foo> func (Ptr<Foo> a, Ptr<Foo> b);

Foo::ptr func (Foo::ptr a, Foo::ptr b);

FooPtr func (FooPtr a, FooPtr b);

Foo* func (Foo* a, Foo* b);
2 голосов
/ 16 июня 2010

Недостатки определений широко обсуждались во всем Интернете.Например, он столкнется с Ptr в другом пространстве имен:

someLibrary::Ptr somethingElse -> somelibrary::crap

Если набирать boost :: shared_ptr действительно раздражает, вы можете быть using namespace boost.Это сохранит удобочитаемость (люди действительно хотят знать, что это - повышение shared_ptr).

Еще одна вещь, которую я могу предложить вам, это серия typedef.В моей компании существует соглашение, что MyClassPtr является typedef для повышения :: shared_ptr.

...