7

cbegin()実装して機能するカスタムコンテナクラスがありcend()ます。次に foreach ループで使用しますが、修飾子を使用してみましたがbegin()end()メンバー関数が必要なようです。const

for (const auto val: container)

そしてこのように:

for (auto const val: container)

そしてこのように:

for (const auto const val: container)

foreach に一定の c-function を強制的に使用させることは可能ですか?

4

3 に答える 3

10

確かに: 範囲が範囲であるかのように表示されconstます:

template <typename T>
T const& make_const(T const& argument) {
    return argument;
}

// ...
for (auto&& value: make_const(argument)) {
    ...
}

ただし、すべての場合において、範囲ベースforは and を使用begin()end()、決してcbegin()orを使用しませんcend()。代わりにこれらを提供することをお勧めします。

template <typename T>
auto begin(my_container<T> const& t) -> decltype(t.cbegin()) {
    return t.cbegin();
}
template <typename T>
auto end(my_container<T> const& t) -> decltype(t.cend()) {
    return t.cend();
}

my_container明らかに、適切なコンテナー タイプに置き換えたいと考えています。個人的には、おそらく適切なメンバーを提供するだけbegin()ですend()

于 2013-11-12T21:32:06.993 に答える
6

cbegin()とのみを提供する決定が何であるかはわかりませんcend()が、それらはベースの範囲で使用されていません。コンテナーを範囲ベースで使用する場合は、 andを提供する必要があります (const イテレーターを返すようにすることもできます)。begin()end()

于 2013-11-12T21:28:36.680 に答える
1

const と非 const の2 つのオーバーロードで常にbegin()/end()関数を提供する必要があります。新しい/関数の目的は、次のように で演繹できるようにすることです。cbegin()cend()auto

for (auto it = v.cbegin(); it != v.cend(); ) { /* ... */ }

新しい関数がなければ、ここで非 const イテレータを取得する (または非常にぎこちないキャストを挿入する) ことしかできませんでした。

于 2013-11-12T22:44:28.183 に答える