2010-11-11 6 views
1

J'ai écrit ma fonction bind qui renvoie un foncteur nul, car je n'ai pas de boost. Bien que ce code se compile bien, il ne se comporte pas comme prévu. Lorsque j'indique 2 comme nombre de chiffres et que j'essaie de les entrer, le programme se termine la première fois que je tape retour. Et, quand je débogue, il se sépare à l'intérieur mem_fun_t::operator(). Qu'est-ce que je fais mal ici? Et comment le rectifier?Qu'est-ce que je fais de mal avec ma fonction de liaison ici?

#include <iostream> 
#include <stdlib.h> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <functional> 

using namespace std; 

namespace MT 
{ 
    template<class Operation> 
    struct binder 
    { 
     protected: 
      Operation _op; 
      typename Operation::argument_type _arg; 

     public: 
      binder(Operation& fn, typename Operation::argument_type arg) 
       :_op(fn), _arg(arg) 
      { 
      } 

      typename Operation::result_type operator()() 
      { 
       return _op(_arg); 
      } 
    }; 

    template<class Operation, class Arg> 
    binder<Operation> bind(Operation op, Arg arg) 
    { 
     return binder<Operation>(op, arg); 
    } 
}; 

int main() 
{ 
    vector<int> vNumbers; 
    vector<char> vOperators; 
    int iNumCount = 0; 
    int iNumOperators = 0; 

    cout << "Enter number of number(s) :) :\n"; 
    cin >> iNumCount; 

    int iNumber; 
    cout << "Enter the " << iNumCount << " number(s):\n"; 

    generate_n(back_inserter(vNumbers), iNumCount, MT::bind(mem_fun(&istream::get), &cin)); 

    system("clear"); 

    copy(vNumbers.begin(), vNumbers.end(), ostream_iterator<int>(cout, " ")); 
    cout << endl; 
} 
+0

Juste une remarque: système (« clair ») n'est pas une commande valide sous Windows . – Puppy

+0

@DeadMG: Travailler sous Linux. – nakiya

+0

J'ai pensé quelque chose comme ceci à: http://www.gammon.com.au/forum/?id=2891, http://www.codeguru.com/cpp/tic/tic0239.shtml – lsalamon

Répondre

0

istream :: get n'est pas la bonne méthode à utiliser, car il lit des caractères, non ints. Vous aurez besoin d'utiliser l'opérateur >> (et en sélectionnant la surcharge droite est très bavard), ou tout simplement écrire un foncteur différent:

template<class T> 
struct Extract { 
    istream &stream; 
    Extract(istream &stream) : stream (stream) {} 

    T operator()() { 
    T x; 
    if (!(stream >> x)) { 
     // handle failure as required, possibly throw an exception 
    } 
    return x; 
    } 
}; 

// ... 
generate_n(back_inserter(vNumbers), iNumCount, Extract<int>(cin)); 
+0

@Roger Pate: Merci. Tous les commentaires sur le foncteur sont également les bienvenus. Et pourquoi un tel foncteur n'est-il pas disponible en STL? – nakiya

+0

ou 'copy_n()' (ou 'transform_n') avec' istream_iterator'. (pas besoin de 'Extraire <>', mais alors vous devez écrire 'copy_n()'). – wilhelmtell

+0

@wilhelmtell: J'y avais pensé, mais c'est plus simple ici. –

Questions connexes