Как кодировать Const и Mutable перегрузки? - PullRequest
2 голосов
/ 21 января 2010

Мне кажется, что этот код встречается довольно часто в моем коде, когда две функции выполняют одну и ту же задачу, кроме постоянства их параметров / возвращений.

int& myClass::getData()
{
        return data;
}

// called for const objects 
const int& myData::getData() const
{
        return data;
}

Это оскорбляет мое чувство СУХОГО. Для однострочника это не проблема, но с увеличением getData () становится очевидным дублирование.

Я знаю, ПОЧЕМУ мне нужны оба метода, но чувствую, что должен быть лучший способ реализовать это. Может ли помочь трюк с шаблоном, или у меня должен быть один метод, который вызывает другой метод приведения константы туда-сюда при необходимости?

ДОБАВЛЕНО: В качестве более реального примера приведу пример типичной реализации STL vector :: at ():

const_reference at(size_type _Off) const
    {   // subscript nonmutable sequence with checking
    if (size() <= _Off)
        _Xran();
    return (*(begin() + _Off));
    }

reference at(size_type _Off)
    {   // subscript mutable sequence with checking
    if (size() <= _Off)
        _Xran();
    return (*(begin() + _Off));
    }

Ответы [ 3 ]

3 голосов
/ 21 января 2010

Используйте следующий трюк (который я изначально получил из книги Скотта Мейерса Effective C ++ ):

int& myClass::getData()
{
    // This is safe because we know from out here
    // that the return value isn't really const
    return const_cast<int&>(const_cast<const myClass&>(*this).getData());
}

const int& myData::getData() const
{
    return data;
}

Очевидно, что для такой короткой функции вам может быть проще просто дублировать код, но эта идиома полезна, когда у вас более длинная функция (например, vector<T>::at или она подвержена множеству изменений.

2 голосов
/ 21 января 2010

Предоставление такой функции, как:

int& myClass::getData()
{
    return data;
}

, вероятно, неправильно - вы также можете сделать «данные» публичными. И второе должно быть записано как:

int myData::getData() const
{
   return data;
}
1 голос
/ 21 января 2010

Причина, по которой функции Стандартной библиотеки, которые вы цитируете, дублируют код, заключается в том, что функции Стандартной библиотеки должны быть максимально возможными. Помещение вызова другой функции там (как другие правильно предложили сделать) может это испортить. Но ваш код, вероятно, находится под гораздо менее строгими ограничениями производительности, поэтому вы должны использовать общий код, где это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...