你对typedef'ing shared_ptr的约定是什么?

Emi*_*ier 46 c++ boost naming-conventions shared-ptr

我在typedef的boost :: shared_ptr模板的命名约定之间翻转.例如:

typedef boost::shared_ptr<Foo> FooPtr;
Run Code Online (Sandbox Code Playgroud)

在制定一项公约之前,我想看看其他人使用什么.你的约定是什么?

编辑:

对于那些在Foo中嵌入typedef的人来说,Foo现在"意识到"它将如何被传递并不会让你烦恼吗?它似乎打破了封装.这个怎么样:

class Foo
{
public:
    typedef std::vector<Foo> Vector
};
Run Code Online (Sandbox Code Playgroud)

你现在不会这样做,对吗?:-)

Len*_*mel 28

我也想为这个老问题添加一些选项,即使它们可能引起很大争议......

OldPeculier的答案类似,我喜欢尽可能接近标准指针的短类型名称.

在一个shared_pointer几乎无处不在的项目中,我用过

typedef boost::shared_ptr<Foo> Foo_;

// usage examples:
Foo* myFoo0;
Foo_ myFoo1;
Run Code Online (Sandbox Code Playgroud)

我利用了三件事:

  1. 下划线字符在某种程度上看起来像一个运算符,但它主要被视为一个字母,因此它可以是标识符的一部分(我看不到在标识符末尾禁止它的规则).
  2. 我只需要提出一个 typedef.
  3. 我更喜欢Foo* myFoo1;Foo *myFoo1;几个原因,它与之匹配得很好Foo_ myFoo2.

当需要typedef用于不同类型的智能指针时,我会选择

typedef shared_ptr<Foo> Foo_S;
typedef weak_ptr<Foo>   Foo_W;
typedef unique_ptr<Foo> Foo_U;

// usage examples:
Foo*  myFoo2;
Foo_S myFoo3;
Foo_W myFoo4;
Foo_U myFoo5;
Run Code Online (Sandbox Code Playgroud)

随着标准和编译器实现中不断增加的Unicode支持,我很想尝试以下语法,假设这些星形字符将被视为类型标识符的常规部分.当然,只有所有参与的开发人员都有一个方便的文本输入方法,这才是实用的:

typedef shared_ptr<Foo> Foo?;
typedef weak_ptr<Foo>   Foo?;
typedef unique_ptr<Foo> Foo?;

// usage examples:
Foo* myFoo6;
Foo? myFoo7;
Foo? myFoo8;
Foo? myFoo9;
Run Code Online (Sandbox Code Playgroud)

(一个快速测试表明,这实际上并不起作用,至少在我的构建环境中.但同样的情况也是如此Foo_ä.)

  • 作为这个答案的作者,我想透露我在twitter上发布了一个链接,上面是最后一个代码示例的截图.由于代码的热闹外观 - 超过150次转发和超过50,000次观看 - 推特获得了高人气,因此相对较多的赞成可能不具代表性. (2认同)

pdu*_*sen 27

答:不要这样做.这对你和其他人来说都很方便.说出你的意思.

  • 是的,我同意.在这种情况下,Typedef只会节省您的输入,而不会保存其他内容.它只增加了一个间接性来理解代码. (3认同)

Jam*_*lis 15

我的偏好:

class Foo
{
public:

    typedef boost::shared_ptr<Foo> SharedPointer;
};
Run Code Online (Sandbox Code Playgroud)

公正的问题FooPtr是你可能有不同类型的指针(例如,weak_ptrs).我也不太关心缩写,但这完全是另一回事.

  • 正如在评论中指出的那样,这会产生包含头的问题.如何在不包含`Foo.h`的头文件中使用`Foo :: SharedPointer`? (2认同)

Nat*_*nst 5

就个人而言,在我负责的代码中,您通常会看到FooPtr typedef在相同的命名空间范围内,因为Foo Foo将包含与FooPtr相同类型的通用名称"SmartPtr"typedef.拥有FooPtr可以轻松实现非详细的手动操作.具有'SmartPtr'的嵌套typedef或一些quivalent允许在模板,宏等中轻松通用,而无需知道智能指针的实际类型.

另外,我建议在这个问题上添加一个"主观"标签.