私のクラスのインターフェースには、存在しないかもしれないオブジェクトへのアクセサが含まれています。現在、null の可能性があるポインターを返します。ポインターをここでstd::optional
提案されているように置き換えたいと思います。アクセサーには、Meyers の const_cast トリックを使用して同じコードを 2 回繰り返さないようにするオーバーロードがあります。const
要するに、これを置き換えたい:
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
か?