2010-11-11 27 views
0

Quelque chose comme ceci:Comment créer un foncteur qui va lire la prochaine valeur du flux d'entrée?

std::bind1st(std::mem_fun(&istream::get ??), cin). Cela ne semble pas fonctionner pour moi.

EDIT:

Utilisation:

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

est le '?? ou une partie du code, ou essayez-vous d'attirer l'attention sur quelque chose? –

+0

Est-ce que cela doit être une fonction de générateur (?)? La bibliothèque standard a 'istream_iterator' pour lire la prochaine valeur. – visitor

+0

@Marcelo Cantos: :). Non, cela ne fait pas partie du code. J'essaie de demander s'il y a une fonction correcte à mettre là-dedans. – nakiya

Répondre

1

Je ne pense pas que les fonctions de liaison standards vous permettent de définir les fonctions nulaires. bind1st lie au premier argument d'une fonction binaire et renvoie une fonction unaire qui transmet son paramètre en tant que second paramètre de la fonction liée.

Vous pouvez aller à l'extérieur de la bibliothèque standard, cependant, et utiliser Boost.Bind:

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

std::mem_fun prend un pointeur. Donc, ne

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

Vous pouvez également utiliser std::istream_iterator avec une coutume/volée copy_n algorithme (qui est malheureusement pas standard):

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