заполнение std :: [container] из функции путем передачи выходного итератора - PullRequest
4 голосов
/ 27 декабря 2010

Я хочу заполнить контейнер изнутри функции, передав выходной итератор, так как это наиболее эффективный способ сделать это, как я понимаю. например,

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

( Возвращает ли std :: list дорого? )

Но как я могу применить тип, на который должен указывать итератор? По сути, я хочу сказать, что «эта функция принимает выходной итератор типа boost :: tuple».

Ответы [ 2 ]

5 голосов
/ 27 декабря 2010

Вы можете использовать boost :: enable_if в сочетании с std: iterator_traits :

#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;
}
2 голосов
/ 27 декабря 2010

Вам не нужно. В любом случае код не будет компилироваться , если вызывающая программа передаст неверный тип итератора.

Так что оно уже навязано вам.

...