智能指针、typedef和前向声明

smart pointers, typedefs and forward declarations

本文关键字:声明 typedef 指针 智能      更新时间:2023-10-16

我喜欢使用智能指针,并且看过一些代码,这些代码很好地利用了typedef,使它们更漂亮。例如:

struct A {
    typedef boost::shared_ptr<A> pointer;
};

允许我写:A::pointer a(new A);

但我在typedef的快乐中遇到了一个小障碍://,转发声明。。。

想象一下这个场景:

struct B;
struct A {
    boost::shared_ptr<B> b_;
};
struct B {
    boost::shared_ptr<A> a_;
};

效果很好,但我很想稍微清理一下。不幸的是,这是不起作用

struct B;
struct A {
    typedef boost::shared_ptr<A> pointer;
    B::pointer b_; // <-- error here
};
struct B {
    typedef boost::shared_ptr<B> pointer;
    A::pointer a_;
};

我理解为什么在文件的这一点上,编译器没有信息表明B实际上有一个名为pointer的类型。

我有一种感觉,至少在某些事情上,我一直在使用旧方法,但我很想听听一些聪明的想法。

typedefs的使用并没有让它变得更漂亮——它毫无价值。您可以将shared_ptr设置为不完整类型,所以只需使用shared_ptr<B>即可。

如果您想共享typedef,您可能需要使用名称空间来声明它们:

struct A;
struct B;
namespace Aimpl {
  typedef boost::shared_ptr<A> pointer;
}
namespace Bimpl {
  typedef boost::shared_ptr<B> pointer;
}
struct A {
    Bimpl::pointer b_;
};
struct B {
    Aimpl::pointer a_;
};

我可以想到两种方法:

  • 您可以创建一个ptr_for模板,并使用类似于以下ptr_for<B>::type b_ptr_;的模板
  • 您可以将这两个结构拉入(我知道这可能不是您想要的),这样实现的定义都可以出现在AB的定义之后