私のプロジェクトでは、ストリームを特定のタイプの値に分割したいので、テンプレート関数を次のように実装します
template <typename TElem, typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
TElem elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
TElem
呼び出すときに型を明示的に指定する必要があるため、これは厄介だと思います。たとえば、次のように書く必要があります。
std::vector<int> v;
SplitSpace<int>(std::cin, back_inserter(v));
// I want to it to be SplitSpace(std::cin, back_inserter(v));
(テンプレート)イテレータから値の型を取得しようとし、std::iterator_traits
次のように使用しました:
template <typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
typename std::iterator_traits<TOutputIter>::value_type elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
ただし、上記のコードは では機能しませんback_insert_iterator
。名前空間back_insert_iterator/front_insert_iterator/insert_iterator
内のソース コードを確認したところ、すべて.std
value_type/difference_type/pointer/reference
void
これらのタイプがすべて である理由を知りたいのvoid
ですが、これについて何か考慮事項はありますか? 別の質問は、SplitSpace
関数を呼び出すときに要素の型を明示的に指定せずに関数を実装することは可能ですか? ありがとう。