この質問にはさらに準備が必要なので、最初にいくつかのコードを提供し、次に正確な質問を提供します
次の型が宣言されていると仮定します
template<typename T>
struct some_type
{
T t_;
};
そのようなファクトリ関数で構築されます
typedef float numeric_type;
std::vector<std::string> construction_material;
//Push_back of strings in certain form...
std::vector<std::unique_ptr<some_type<numeric_type>> instances;
build_instances(construction_material.begin(), construction_material.end(), back_inserter(instances));
構築関数は次のようなものになります
template<typename input_iterator, typename output_iterator>
output_iterator build_instances(input_iterator begin, input_iterator end, output_iterator out)
{
for(input_iterator iter = begin; iter != end; ++iter)
{
//This won't work, but to illustrate some ideas...
//build_instance<std::iterator_traits<output_iterator>::value_type>(*iter)
}
//[...]
return *out;
}
template<typename T>
std::unique_ptr<some_type<T>> build_instance(std::string const& material)
{
static_assert(std::is_floating_point<T>::value == true, "The template type needs to be a floating point type.");
std::unique_ptr<some_instance<T>> instance(new some_instance<T>());
//Some processing...
return instance;
}
次のように、関数を変更してコンテナを返す(またはコンテナタイプをテンプレート化する)ことができることを知っています
template<typename input_iterator, typename T>
std::vector<std::unique_type<T>> build_instances(input_iterator begin, input_iterator end,
output_iterator out)
{
//Likewise code to the previous snippets...
return ...
}
私が解決できなかった問題は次のとおりです。
- back_inserterのようなアプローチを使用することは可能ですか、それとも不可能ですか? 発信者にとって最も柔軟であるように見えますか?
- インスタンスを1つずつ構築する際に使用できるように、build_instances本体でnumeric_typeを保持する方法(output_iteratorを介して取得する場合と同様)
- std::unique_ptrs にラップされたオブジェクトを待機することを呼び出し元が認識していることを確認するにはどうすればよいですか? 代替手段は単純なポインターと同じですが、私はそれについて熱狂的ではありません。
このテンプレート メソッドをよりエレガントにするにはどうすればよいですか?という見出しの同様の種類の質問があります。(または: あまり明示的なテンプレート パラメーターは必要ありません)。コンテナーを受け取り、それを別の種類のコンテナーに変換します。
編集 Jogojapanのコメントにコメントされているように、現在私は入力をそのように変換しています
std::transform(construction_material.begin(), construction_material.end(), std::inserter(instances, instances.begin()), build_instance<numeric_type>);
ただし、後続の関数呼び出しにも typedef を指定する必要があり私は間違っていたようですが、教育とすべての目的のために、数値型を型定義してイテレータから推測する必要性をさらに減らすことは可能でしょうか?numeric_type
、これはやや面倒です。私はそれを避けることを望みます。