我刚刚开始研究一个新的代码库,其中每个类都包含一个shared_ptr typedef(similar to this),如:
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定义保存在每个类中。
答案 0 :(得分:9)
宏(#define)始终全局定义。 这意味着每次使用'string'Ptr(甚至变量)都将被宏替换。
typedef可以放在一个类,一个命名空间中......所以你可以更好地控制它。
修改强> 另一个优点是你可以在不同的类中使用不同的Ptr类型,例如
如果这些类在模板化代码中使用,则可以使用T :: Ptr作为指向类的指针类型,模板将使用最适合该类的指针。
答案 1 :(得分:2)
已经在整个网络上广泛讨论了定义的缺点。例如,它将与另一个命名空间中的Ptr冲突:
someLibrary::Ptr somethingElse -> somelibrary::crap
如果输入boost :: shared_ptr真的很烦,你可以using namespace boost
。它将保持可读性(人们真的想知道它是提升shared_ptr)。
我可以建议你的另一件事是一系列typedef。在我的公司,有一个约定MyClassPtr是boost :: shared_ptr的typedef。
答案 2 :(得分:2)
是保存输入的唯一目的 升压:: shared_ptr的?
是的,差不多。好吧,不是为了保存输入本身,而是为了提高可读性。但我认为这就是你的意思。
比较这些,看看你喜欢哪个。除了了解宏和命名空间混乱的问题之外,没有正确的答案。
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);