質問する範囲ベースでcbegin()/cend()の使用を強制する

質問する範囲ベースでcbegin()/cend()の使用を強制する

この質問は次のことを指します:

新しい ranged-for はいつ使用すればよいですか? また、新しい cbegin/cend と組み合わせることはできますか?

cbegin()この質問に基づいて、との使用を強制するにはcend()、たとえば次のようにする必要があります。

for (auto& v: const_cast<decltype(container) const>(container))

これは、それを排除するはずの構造体の定型コードが多すぎます。もっとコンパクトな方法はありますか? 質問の理由は、暗黙的に共有されたコンテナーが、 の使用を手がかりにして、コンテナーbegin()自体を切り離す可能性があるからです。

ベストアンサー1

アップデート:std::as_constC++17 ではヘッダーになります<utility>

C++17以前組み込み構文はありませんが、便利なラッパーを簡単に記述できます。

template<typename T> constexpr const T &as_const(T &t) noexcept { return t; }
for (auto &v: as_const(container))

これは具体的begin() constにではなくcbegin()標準コンテナの一般要件それを指定してcbegin()同じbegin() constように動作させます。

コンテナが非 const 反復を特別に扱う場合、コンテナ自体にメンバー関数を持たせることが合理的です。

const Container &crange() const noexcept { return *this; }
for (auto &v: container.crange())

おすすめ記事