Pertanyaan mengisi sebuah std :: [container] dari suatu fungsi dengan melewatkan iterator output


Saya ingin mengisi wadah dari dalam fungsi dengan meneruskan iterator keluaran karena ini adalah cara yang paling efisien untuk melakukannya seperti yang saya pahami. misalnya

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

(Apakah mengembalikan std :: daftar mahal?)

Tapi bagaimana saya bisa menegakkan jenis, iterator harus menunjuk ke? Pada dasarnya saya ingin mengatakan "fungsi ini membutuhkan iterator keluaran dari tipe boost :: tuple".


4
2017-12-27 09:00


asal


Jawaban:


Kamu dapat memakai boost :: enable_if setara dengan 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;
}

5
2017-12-27 09:16



Anda tidak perlu melakukannya. Kode akan gagal dikompilasi bagaimanapun jika pemanggil melewati tipe iterator yang salah.

Jadi sudah diberlakukan untuk Anda.


2
2017-12-27 10:24