2010-12-27 5 views
4

出力イテレータを渡して関数内からコンテナに移入したいと思っています。例えば出力イテレータを渡して関数からstd :: [container]を移入する

template <typename OutputIterator> 
void getInts(OutputIterator it) 
{ 
    for (int i = 0; i < 5; ++i) 
    *it++ = i; 
} 

Is returning a std::list costly?

しかし、どのように、私は種類を強制することができ、イテレータが指している必要がありますか?基本的には、「この関数は、boost :: tuple型の出力イテレータを取ります。

+2

出力イテレータは 'boost :: tuple' * always *型のものでなければなりません。 – Naveen

+0

はい、私は逆参照し、boost :: tupleオブジェクトを入れます。 – fgungor

答えて

5

あなたはstd:iterator_traitsと一緒にboost::enable_ifを使用することができます。

#include <boost/type_traits/is_same.hpp> 
#include <boost/utility/enable_if.hpp> 

template <typename OutputIterator> 
typename boost::enable_if< 
    boost::is_same< 
     int, /* replace by your type here */ 
     typename std::iterator_traits<OutputIterator>::value_type 
    > 
>::type getInts(OutputIterator it) 
{ 
    for (int i = 0; i < 5; ++i) 
    *it++ = i; 
} 
+0

VS2010コンパイラが「関数テンプレートのインスタンスがありません」と言っています。back_inserter(int_list)を渡すとgetIntsが引数リストと一致します – fgungor

+0

@fgungor:std :: back_inserterから作成されたイテレータはsinkであるため、value_type定義をサポートしていません。 –

+0

@Zenikoder:ああ私は考えました:)それはvoidとしてvalue_typeを定義します。 :: container_type :: value_typeでvalue_typeを取得できます。 boost :: enable_ifのような状態になる可能性がありますか? – fgungor

2

あなたがする必要はありません。呼び出し元が間違ったイテレータタイプを渡した場合、コードはとなり、をコンパイルできません。

あなたのために既に強制されています。

+1

std :: vector .begin()を渡すとコンパイルされますが、すぐにコンテナをオーバーフローさせるため正しく動作しません。ここで必要な出力イテレータは、コンテナを展開する必要があります。 –

+0

必ずしもそうではありません。あなたは既に適合するようにベクトルのサイズを変更しているかもしれません。そして、あなたは確かにコンテナを展開するものを望まないでしょう。いずれにしても、私が質問を理解するとき、 'value_type'が互換性があるかどうかを確認するだけです。 – jalf

関連する問題