Интерфейс моего класса включает в себя доступ к объекту, который может не существовать. В настоящее время он возвращает указатель, который может быть нулевым. Я хотел бы заменить указатель на std::optional
, как предложено here. У аксессуара есть перегрузка const
, которая использует Meyers' const_cast trick, чтобы избежать повторения одного и того же кода дважды.Эквивалент const_cast для std :: optional
Короче говоря, я хочу, чтобы заменить это:
T const * MyClass::get() const {
/* non-trivial */
}
T * MyClass::get() {
return const_cast<T *>(const_cast<MyClass const *>(this)->get());
}
с этим:
std::optional<T const &> MyClass::get() const {
/* non-trivial */
}
std::optional<T &> MyClass::get() {
auto t = const_cast<MyClass const *>(this)->get();
return t ? std::optional<T &>(const_cast<T &>(* t)) : std::nullopt;
}
Замена кажется неудовлетворительным, потому что:
- он вводит ветвь;
- дополнительная сложность несколько поражает цель сделать перегрузку легкой (и тривиально оптимизированной компилятором).
Я предполагаю, что std::optional
специализации для справки можно в основном сводится к немного больше, чем указатель с дополнительной безопасностью и интересно, поэтому, если есть какой-то способ, чтобы сохранить простоту решения указателя. Есть ли более удовлетворительный способ написать перегрузку доступа, чтобы использовать std::optional
?
Вы уверены, что можете напрямую использовать ссылки на 'std :: optional'? Чтение n3690, это звучит для меня так, как будто требуется * тип объекта *, например указатель или 'std :: reference_wrapper'. – dyp
Есть ли еще компилятор, который поддерживает 'std :: optional'? – us2012
Вам не разрешено создавать экземпляр std :: optional по ссылке (люди, сделавшие это предложение, считают, что это будет слишком противоречиво и, возможно, не обязательно добавляться к C++ 1y). С n3690 (C++ 1y CD) 20.6.2p1: «Программа, которая требует создания шаблона, необязательного для ссылочного типа, или для (возможно, cv-квалифицированных) типов in_place_t или nullopt_t, плохо сформирована». – Nevin