2

C ++ 11より前では、クラス/構造体のconstおよびnon-constの使用シナリオを処理するために、メソッドの2つの非常によく似たバリアントを実装する必要がありました。

struct my_struct_t{
     ....
     float_t& at( uint32_t row, uint32_t col)
     {
         return *(((float_t*)((uint8_t*)numbers+row*row_stride)) + col);
     }

     float_t const& at( uint32_t row, uint32_t col) const
     {
         return *(((float_t*)((uint8_t*)numbers+row*row_stride)) + col);
     }

};

これはC++11で変更されましたか?

4

3 に答える 3

2

いいえ
それは標準ライブラリで明らかです(それはまだ明示的なconstメソッドを使用しています)。

于 2012-10-22T06:05:13.483 に答える
2

これはC++11では変更されていませんが、C++17では変更されています。

T const & f() const {
    return something_complicated();
}
T & f() {
    return const_cast<T &>(std::add_const(*this).f());
}

類似のconstメンバー関数とnon-constメンバー関数の間のコードの重複を削除するにはどうすればよいですか?を参照してください。

編集

この投稿をしてから、何度か立場を変えました。上記のテキストは私の現在の考えを反映しています。const_cast私の以前のポジションは両方のキャストを好むことでした、そして私の元のポジションはstatic_castその時でしたconst_cast。できるのは追加/削除と修飾子const_castだけなので、より安全です。誤って他の方法でキャストする可能性があります。私の当初の考えは、追加するという最も可能性の高い「安全な」操作と、削除するという危険な可能性のある操作を分離するため、追加することを好むことでした。上記のコードのバージョンには、によって記述された安全な操作があります。これは、私が望むことだけを実行でき、正しく実行したことを確認するために必要な唯一のこととして、潜在的に危険なままにします。constvolatilestatic_caststatic_castconstconstconststd::as_constconst_cast

于 2012-10-23T04:09:41.593 に答える
-2

「2つのバリアントを実装しない」ことを取り除く必要はないと思います。

  1. 両方のバリアントが異なることをしている場合は、それらを保持する必要があります
  2. 両方のバリアントが同じことをしている場合は、非constバージョンを削除し、そのconstバージョンのみを維持します

ちなみに、必要に応じて3番目と4番目のバリアントがあります。

float_t& at( uint32_t row, uint32_t col) volatile;
float_t& at( uint32_t row, uint32_t col) const volatile;

[注:無関係ですが、C ++ 11ではnoexcept、例外関連情報のキーワードを使用してすべてのバリアントを追加できます。

float_t& at( uint32_t row, uint32_t col) noexcept;

]

于 2012-10-22T06:17:45.437 に答える