为boost :: shared_ptr <const foo =“”> </const>命名typedef

时间:2010-05-17 18:06:01

标签: c++ boost shared-ptr

愚蠢的问题,但是说你有Foo课:

class Foo
{
public:
    typedef boost::shared_ptr<Foo> RcPtr;

    void non_const_method() {}
    void const_method() const {}
};

使用const Foo :: RcPtr不会阻止在类上调用非const方法,以下将编译:

#include <boost/shared_ptr.hpp>

int main()
{
    const Foo::RcPtr const_foo_ptr(new Foo);
    const_foo_ptr->non_const_method();
    const_foo_ptr->const_method();

    return 0;
}

但是命名一个typedef ConstRcPtr对我来说意味着typedef将是

typedef const boost::shared_ptr<Foo> ConstRcPtr;

这不是我感兴趣的。一个更奇怪的名字,但可能更准确,是RcPtrConst:

typedef boost::shared_ptr<const Foo> RcPtrConst;

然而,谷歌搜索RcPtrConst得到零命中,因此人们不会将其用作typedef名称:)

有没有人有任何其他建议?

3 个答案:

答案 0 :(得分:4)

typedef的名称不代表用于定义其类型的语法结构。 typedef名称应该传达它的一些期望的含义。例如,标准将const T上的迭代器名称定义为const_iterator,即使迭代器本身不是const(您仍然可以增加它)。事实上,迭代器的整个目的是改变它,以便迭代序列:)

typedef T const* const_iterator;

对于指针,我个人认为通常将它们定义为常量没有什么理由。因此,尾随部分前面的Const可以传达与迭代器相同的含义,并且将与现有实践一致。所以我觉得你说完

是完全没问题的
typedef boost::shared_ptr<Foo const> ConstRcPtr;

事实上,这也是std::allocator<>::const_pointer的措辞。

答案 1 :(得分:4)

关于const的去向的陈述是正确的:你需要另一个typedef。在我们的项目中,我们使用 Foo :: TPtr Foo :: TConstPtr 作为标准typedef。

答案 2 :(得分:1)

命名一个typedef ConstRcPtr对我来说意味着typedef将是typedef const boost::shared_ptr<Foo> ConstRcPtr;

为什么这意味着什么?当人们谈论“常量指针”(而不是非常量指针)时,他们几乎总是指const char*,而不是char *constconst_iterator是一个迭代器到const,而不是一个常量的迭代器,我不会感到惊讶ConstRcPtrRcPtr之间的关系与它们之间的关系是一样的。 const_iteratoriterator

如果您需要区分const char*char *const,那么是的,您可以将char *const称为“常量指针”,将const char*称为“指针指向const” ”。但你几乎从不这样做,因此短语“const指针”用于常见情况。我认为这也适用于此,除非你打算输入以下四个:

boost::shared_ptr<Foo>
boost::shared_ptr<const Foo>
const boost::shared_ptr<Foo>
const boost::shared_ptr<const Foo>

在这种情况下,你必须对名字更有创意。