Как создать функтор, который будет читать следующее значение из входного потока? - PullRequest
0 голосов
/ 11 ноября 2010

Примерно так:

std::bind1st(std::mem_fun(&istream::get ??), cin).Это, кажется, не работает для меня.

РЕДАКТИРОВАТЬ:

Использование:

vector<int> vNumbers;
generate_n(back_inserter(vNumbers), iNumCount, functor);

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

std::mem_fun принимает указатель.Так что

bind(std::mem_fun(&istream::get), &cin)

где

template <typename F, typename Res, typename Arg>
struct binder
{
    binder(F const& f, Arg const& arg) : f(f), arg(arg) {}
    Res operator()() { return f(arg); }
private:
    F f; Arg arg;
};

template <typename F, typename Arg>
binder<F, typename F::result_type, Arg> bind(F const& f, Arg const& arg)
{ return binder<F, typename F::result_type, Arg>(f, arg); }

Вы также можете использовать std::istream_iterator с пользовательским / украденным copy_n алгоритмом (который, к сожалению, не является стандартным):

template <typename I, typename O>
O copy_n(size_t n, I first, I last, O result)
{
    size_t k = 0;
    while (first != last && k++ < n) *result++ = *first++;
    return result;
}
1 голос
/ 11 ноября 2010

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

Однако вы можете выйти за пределы стандартной библиотеки и использовать Boost.Bind:

boost::bind(&istream::get, &cin)
...