如何创建一个从输入流中读取下一个值的仿函数?

时间:2010-11-11 11:20:19

标签: c++ stl functor istream

这样的事情:

std::bind1st(std::mem_fun(&istream::get ??), cin)。这对我来说似乎不起作用。

编辑:

使用:

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

2 个答案:

答案 0 :(得分:1)

我认为标准绑定函数不允许您定义nullary函数。 bind1st绑定到二进制函数的第一个参数,并返回一个一元函数,该函数将其参数作为绑定函数的第二个参数传递。

然而,你可以走出标准库,并使用Boost.Bind:

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

答案 1 :(得分:1)

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;
}