小编Mar*_*arc的帖子

typedef'ing共享指针的最佳策略是什么?

我有一个关于使用typedef进行冗长模板的快速问题.关键点:我发现自己处于一种腌制状态 - 似乎没有一个将typedef放在除客户端函数本地之外的好地方.虽然有类似的SO问题(例如参见这里),但似乎没有人能够解决这个问题.请注意,这个问题并没有解决下面的typedef是否可取的问题 - 我试图简化出于说明目的.

与我一起工作时出现了我的问题boost::shared_ptr<T>.基本上,我想做以下事情:

#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<Widget> WidgetPtr;
Run Code Online (Sandbox Code Playgroud)

将此typedef放在Widget声明头中似乎很难看.这里似乎有两个注意事项:(i)如果Widget它本身没有在其成员中使用共享指针,我们添加了一个额外的include(因为我们无法转发声明boost::shared_ptr模板类 - 如果我是正确的我错误?)(ii)如果我们想在声明另一个类(称为该类Foo)期间使用此typedef,我们通过包括Widget.h而不是简单地向前声明Widget或包括WidgetFwd.h...... 来违反最佳实践...除非后者重复此类型的def .此外,boost::shared_ptr<Widget>在声明Widget自己的过程中输入deff似乎没有意义- 我们似乎在混合Widget声明,期待客户如何利用Widget 接口.

好吧,所以这很糟糕,但这更糟糕:如果我不尝试上面的某些组合,我最终会在客户端代码中出现重复的typedef,这会产生不一致(因此,可能是错误) - 整个点就是给定的Widget,WidgetPtrtypedef本身应该作为一种类型.示例:我们不想Foo使用WidgetPtr一个typedef boost::shared_ptr,而Bar使用WidgetPtr作为typedef std::auto_ptr.

另一种方法(以及我在网上讨论中提到的少数几种方法之一)是将typedef作为公共成员,Widget然后使用Widget::Ptr:

class Widget {
// ...
public:
     typedef boost::shared_ptr<Widget> Ptr;
};
Run Code Online (Sandbox Code Playgroud)

同样,我不喜欢这个,因为(i)它表明指针类型在某种程度上是类的成员,并且(ii)它导致一个不稳定的接口.更糟糕的是:因为我编写的每个类都可能指向使用智能指针,我最终会追逐想象中的客户端尾部.丑陋,丑陋,丑陋.

就目前而言,我已经从这个代码库中删除了typedef(因为它们导致严重的混淆,重复)并在选定的函数中重新引入它们.这里再次出现了使用不一致的问题,但并不是那么严重.

我能想到的唯一其他解决方案 …

c++ boost typedef shared-ptr

20
推荐指数
3
解决办法
4776
查看次数

标签 统计

boost ×1

c++ ×1

shared-ptr ×1

typedef ×1