Наименование typedef для повышения :: shared_ptr <const Foo> - PullRequest
3 голосов
/ 17 мая 2010

Глупый вопрос, но скажем, у вас класс Foo:

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

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

Наличие const Foo :: RcPtr не препятствует вызову неконстантных методов для класса, компилируется следующее:

#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;

Однако Googling для RcPtrConst получает ноль хитов, поэтому люди не используют это как имя определения типа:)

У кого-нибудь есть другие предложения?

Ответы [ 3 ]

4 голосов
/ 17 мая 2010

Ваше утверждение о том, куда идет const, верно: вам нужен другой typedef. В нашем проекте мы используем Foo :: TPtr и Foo :: TConstPtr в качестве стандартных typedefs.

4 голосов
/ 17 мая 2010

Имя typedef не представляет синтаксическую конструкцию, используемую для определения его типа. Имя typedef должно передавать некоторые из его желаемых значений. Например, Стандарт определяет имена итераторов для const T как const_iterator, даже если сам итератор не является константным (вы все равно можете увеличивать его). Фактически, вся цель итератора - изменить его, чтобы выполнить итерацию по последовательности:)

typedef T const* const_iterator;

Что касается указателей, я лично вижу небольшую причину для обычно typedef их как константы. Таким образом, Const перед конечными частями может передавать то же значение, что и итераторы, и будет идти с существующей практикой. Так что я думаю, что это нормально для вас, чтобы пойти и сказать

typedef boost::shared_ptr<Foo const> ConstRcPtr;

На самом деле, именно так и формулируется std::allocator<>::const_pointer.

1 голос
/ 17 мая 2010

имя typedef ConstRcPtr подразумевает для меня, что typedef будет typedef const boost::shared_ptr<Foo> ConstRcPtr;

Почему это подразумевает это? Когда люди говорят о «константных указателях» (в отличие от неконстантных указателей), они почти всегда имеют в виду const char*, а не char *const. const_iterator является итератором-к-константу, а не итератором, который является константой, и я не удивлюсь, что отношения между ConstRcPtr и RcPtr такие же, как отношения между const_iterator и iterator.

Если вам нужно различить const char* и char *const, тогда да, вы можете назвать char *const «указатель констант» и const char* «указатель на констант». Но вы почти никогда этого не делаете, и поэтому в общем случае используется короткая фраза «указатель константы». Я думаю, что это применимо и здесь, если только вы не планируете определить все четыре:

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

В этом случае вам придется быть немного более креативным с именами.

...