範囲ベースのforループに適したすべてのシーケンスを受け入れるC ++パラメータ型

例えば、私はC ++ 11を使用するこのような関数を持っていますforループの構文

void myFunc(const std::vector& bytes) {
    for (char b : bytes) {
       //do something useful to every byte
    }
}

How do I change this function declaration to accept every suitable sequence container, i.e. not only std::vector, but also std::array, std::string, etc?

私が学んだことから、範囲ベースのforループは与えられた range_expression のための begin()end()メソッドの存在に依存しています。通常、他の言語では、すべての反復可能コンテナは、そのようなパラメータに任意のコンテナを渡すために使用できるある種の共通インタフェースを共有しますが、C ++にはそのようなコンテナ階層はありません。代わりに、C ++にはコンテナのような「概念」があるようですが、それだけです。コンパイラの内部でアクセス可能、私は思いますか?

2
ru de
@Eljayこの質問は質問の逆のようなものに答えます。私の質問は標準的なタイプを与えられています、私はこれらすべてを受け入れるためにどのように機能を準備するのですか?
追加された 著者 GreyCat,
@Eljayこの質問は質問の逆のようなものに答えます。私の質問は標準的なタイプを与えられています、私はこれらすべてを受け入れるためにどのように機能を準備するのですか?
追加された 著者 GreyCat,
テンプレートはコンパイル時の静的インタフェースで、 ABC が唯一のものです他のほとんどの言語が持つインタフェースの形式は、実行時インタフェースです。違いを知ってください:)概念はテンプレートタイプに対する単なる制約です。すなわち、 T に置き換えることができる、またはできないものです。それは私が信じる標準にはまだなっていません。
追加された 著者 legends2k,
テンプレートはコンパイル時の静的インタフェースで、 ABC が唯一のものです他のほとんどの言語が持つインタフェースの形式は、実行時インタフェースです。違いを知ってください:)概念はテンプレートタイプに対する単なる制約です。すなわち、 T に置き換えることができる、またはできないものです。それは私が信じる標準にはまだなっていません。
追加された 著者 legends2k,
私は通常ウィキペディアの記事は推奨しませんが、この場合は良い考えだと思います。 ja.wikipedia.org/wiki/Concepts_(C%2B%2B)簡単に言うと、概念は現在ドキュメントのようなものであり、それらを実際の具体的なコンパイラ機能に変換しようとする試みは、新しいC ++標準のいずれにもしないで数十年前から出回っています。まだ。
追加された 著者 Christian Hackl,
私は通常ウィキペディアの記事は推奨しませんが、この場合は良い考えだと思います。 ja.wikipedia.org/wiki/Concepts_(C%2B%2B)簡単に言うと、概念は現在ドキュメントのようなものであり、それらを実際の具体的なコンパイラ機能に変換しようとする試みは、新しいC ++標準のいずれにもしないで数十年前から出回っています。まだ。
追加された 著者 Christian Hackl,
私は通常ウィキペディアの記事は推奨しませんが、この場合は良い考えだと思います。 ja.wikipedia.org/wiki/Concepts_(C%2B%2B)簡単に言うと、概念は現在ドキュメントのようなものであり、それらを実際の具体的なコンパイラ機能に変換しようとする試みは、新しいC ++標準のいずれにもしないで数十年前から出回っています。まだ。
追加された 著者 Christian Hackl,
@GreyCatこれはあなたを助けることができる:始まりと終わりがあるクラス "> stackoverflow.com/questions/25224002/…
追加された 著者 rak007,
私はこのような質問/回答が役立つかもしれないと思います。 -loops "title ="ループの範囲ベースでカスタムタイプを機能させる方法 "> stackoverflow.com/questions/8164567/…
追加された 著者 Eljay,
C ++にはコンテナ階層はありません。 C ++ for-inループには、秘密のコンパイラ内部もありません。 C ++はテンプレートとSFINAEを std :: vector :: beginstd :: vector :: end 、あるいは begin のように使います。 endstd :: beginstd :: end など)、およびbegin/endイテレータを見つけようとするADLの魔法。
追加された 著者 Eljay,
C ++にはコンテナ階層はありません。 C ++ for-inループには、秘密のコンパイラ内部もありません。 C ++はテンプレートとSFINAEを std :: vector :: beginstd :: vector :: end 、あるいは begin のように使います。 endstd :: beginstd :: end など)、およびbegin/endイテレータを見つけようとするADLの魔法。
追加された 著者 Eljay,
C ++にはコンテナ階層はありません。 C ++ for-inループには、秘密のコンパイラ内部もありません。 C ++はテンプレートとSFINAEを std :: vector :: beginstd :: vector :: end 、あるいは begin のように使います。 endstd :: beginstd :: end など)、およびbegin/endイテレータを見つけようとするADLの魔法。
追加された 著者 Eljay,
私はこのような質問/回答が役立つかもしれないと思います。 -loops "title ="ループの範囲ベースでカスタムタイプを機能させる方法 "> stackoverflow.com/questions/8164567/…
追加された 著者 Eljay,

4 答え

これでうまくいくと思います

template
void myFunc(const T& bytes) {
    for (auto b : bytes) {
       //do something useful to every byte
    }
}
6
追加された
これは単なるテンプレート化された関数です - これはインスタンス化時以外は型チェックを提供しません、そしてこれがライブラリに配置されるのであれば、とにかくすべての可能な型引数をインスタンス化する必要があります。もっと良い方法はありますか?
追加された 著者 GreyCat,
@GreyCat すべての適切なシーケンスコンテナ、すなわちstd :: vector だけでなく、std :: array 、std :: stringなども受け入れるようにこの関数宣言を変更するにはどうすればよいですか?これが答えです。テンプレートを使用してください。あなたが何か他のものが必要な場合は、あなたはあなたの質問を明確にする必要があります。ちなみに、テンプレートはライブラリではなくヘッダーファイルに配置されることを意図しています。ライブラリに入れる必要がある場合は、継承について考えてください。
追加された 著者 Amadeus,
@ rak007それが私が考えていることです。私が思いついた解決策は好きではありません。 beginend の異なるイテレータ型に対するIIRCのサポートは、forループをベースにしたrangeに追加されており、私の例ではそれを許可していません
追加された 著者 NathanOliver,
@GreyCat これはインスタンス化時以外は型チェックを行いませんこれが型チェックが行われる唯一の時です。テンプレートが制約されているこちらのようなものをお探しですか?
追加された 著者 NathanOliver,
@NathanOliverこれが彼の意図したところであったと思うので答えになるはずです
追加された 著者 rak007,
あなたのプログラムで何を達成しようとしているのかは不明です。あなたは私たちにもっとコンテキストを教えてもらえますか?
追加された 著者 rak007,
@NathanOliverそれでも彼が探している行動はとにかく推奨されていないのでこれはトリックを行うことができる
追加された 著者 rak007,

これでうまくいくと思います

template
void myFunc(const T& bytes) {
    for (auto b : bytes) {
       //do something useful to every byte
    }
}
6
追加された
これは単なるテンプレート化された関数です - これはインスタンス化時以外は型チェックを提供しません、そしてこれがライブラリに配置されるのであれば、とにかくすべての可能な型引数をインスタンス化する必要があります。もっと良い方法はありますか?
追加された 著者 GreyCat,
@GreyCat すべての適切なシーケンスコンテナ、すなわちstd :: vector だけでなく、std :: array 、std :: stringなども受け入れるようにこの関数宣言を変更するにはどうすればよいですか?これが答えです。テンプレートを使用してください。あなたが何か他のものが必要な場合は、あなたはあなたの質問を明確にする必要があります。ちなみに、テンプレートはライブラリではなくヘッダーファイルに配置されることを意図しています。ライブラリに入れる必要がある場合は、継承について考えてください。
追加された 著者 Amadeus,
@ rak007それが私が考えていることです。私が思いついた解決策は好きではありません。 beginend の異なるイテレータ型に対するIIRCのサポートは、forループをベースにしたrangeに追加されており、私の例ではそれを許可していません
追加された 著者 NathanOliver,
@GreyCat これはインスタンス化時以外は型チェックを行いませんこれが型チェックが行われる唯一の時です。テンプレートが制約されているこちらのようなものをお探しですか?
追加された 著者 NathanOliver,
@NathanOliverそれでも彼が探している行動はとにかく推奨されていないのでこれはトリックを行うことができる
追加された 著者 rak007,
@NathanOliverこれが彼の意図したところであったと思うので答えになるはずです
追加された 著者 rak007,
あなたのプログラムで何を達成しようとしているのかは不明です。あなたは私たちにもっとコンテキストを教えてもらえますか?
追加された 著者 rak007,

これでうまくいくと思います

template
void myFunc(const T& bytes) {
    for (auto b : bytes) {
       //do something useful to every byte
    }
}
6
追加された
これは単なるテンプレート化された関数です - これはインスタンス化時以外は型チェックを提供しません、そしてこれがライブラリに配置されるのであれば、とにかくすべての可能な型引数をインスタンス化する必要があります。もっと良い方法はありますか?
追加された 著者 GreyCat,
@GreyCat すべての適切なシーケンスコンテナ、すなわちstd :: vector だけでなく、std :: array 、std :: stringなども受け入れるようにこの関数宣言を変更するにはどうすればよいですか?これが答えです。テンプレートを使用してください。あなたが何か他のものが必要な場合は、あなたはあなたの質問を明確にする必要があります。ちなみに、テンプレートはライブラリではなくヘッダーファイルに配置されることを意図しています。ライブラリに入れる必要がある場合は、継承について考えてください。
追加された 著者 Amadeus,
@ rak007それが私が考えていることです。私が思いついた解決策は好きではありません。 beginend の異なるイテレータ型に対するIIRCのサポートは、forループをベースにしたrangeに追加されており、私の例ではそれを許可していません
追加された 著者 NathanOliver,
@GreyCat これはインスタンス化時以外は型チェックを行いませんこれが型チェックが行われる唯一の時です。テンプレートが制約されているこちらのようなものをお探しですか?
追加された 著者 NathanOliver,
@NathanOliverこれが彼の意図したところであったと思うので答えになるはずです
追加された 著者 rak007,
@NathanOliverそれでも彼が探している行動はとにかく推奨されていないのでこれはトリックを行うことができる
追加された 著者 rak007,
あなたのプログラムで何を達成しようとしているのかは不明です。あなたは私たちにもっとコンテキストを教えてもらえますか?
追加された 著者 rak007,

コンセプトで、あなたは@ rak007を変身させる

template
void myFunc(const T& bytes) {
    for (auto b : bytes) {
       //do something useful to every byte
    }
}

(無限に)より明示的に

template
void myFunc(const T& bytes) {
    for (auto b : bytes) {
       //do something useful to every byte
    }
}

C ++のコンテナはすでに共通のインターフェース(のファミリー)に準拠していますが、そのインターフェースはコンパイル時の構成要素です。概念とは、ドキュメント内(または仕様内)のツールではなく、これらのインタフェースを指定するための言語内ツールのことです。

2
追加された