ライブラリを作成していて、一連の値を返す必要がある関数がある場合、次のようなことができます。
std::vector<int> get_sequence();
ただし、これには、ライブラリ ユーザーが使用したいコンテナーを使用できるようにするのではなく、std::vector<> コンテナーを使用する必要があります。さらに、パフォーマンスに悪影響を及ぼす可能性のある、返された配列の余分なコピーを追加する可能性があります (コンパイラがこれを最適化できるかどうかによって異なります)。
開始と終了 iter を取るテンプレート化された関数を作成することで、理論的には任意のコンテナーの使用を有効にする (そして不要な余分なコピーを避ける) ことができます。
template<class T_iter> void get_sequence(T_iter begin, T_iter end);
関数は、反復子によって指定された範囲にシーケンス値を格納します。しかし、これの問題は、シーケンスのサイズを知る必要があるため、間に十分な要素がbegin
ありend
、シーケンス内のすべての値を格納する必要があることです。
次のようなインターフェースを考えました。
template<T_insertIter> get_sequence(T_insertIter inserter);
これは、 T_insertIter が挿入反復子 (たとえば、 で作成されたものstd::back_inserter(my_vector)
) である必要がありますが、コンパイラは非挿入反復子を喜んで受け入れますが、実行時に正しく動作しないため、これは誤用しやすいようです。
では、任意の長さのシーケンスを返すジェネリック インターフェイスを設計するためのベスト プラクティスはありますか?