Как избежать повторяющихся константных и неконстантных виртуальных функций?Является ли это возможным? - PullRequest
3 голосов
/ 25 июня 2019

Предположим, у меня есть базовый класс со следующей функцией:

virtual int* get(){ return nullptr; }

и

Я хотел бы предоставить *Версия 1010 * (имейте в виду, что я имею в виду около 50 различных реализаций в унаследованном коде)

const int* get() const { return const_cast<decltype(this)>(this)->GetReturn(); };//NEED CODE BADLY: const_cast :/

Но эта идея должна использовать const_cast - Скотт Мейер предлагает этот подход в своей книге (хотяситуация перевернута) - но действительно ли это безопасно (если да, это также «перспективно»?), например, от того, что члены являются постоянными?

Я могу изменить ситуацию с помощью поиска / замены, но имеяобе реализации во всех классах, кажется, слишком много «паттерна копирования-вставки».

1 Ответ

3 голосов
/ 25 июня 2019

но действительно ли это безопасно

К сожалению, нет:

Вариант 1:

class C
{
    int n;
public:
    int* get() { ++n; return &n; }
    int const* get() const { return const_cast<decltype(this)>(this)->get(); }
};

Вариант 2:

class C
{
    int const n;
public:
    int const* get() const { return &n; }
    int* get() { return const_cast<int*>(const_cast<decltype(this) const*>(this)->get()); }
    void demo() // non-const!
    {
        ++*get();
    }
};

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

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