Что я делаю не так с моей функцией привязки здесь? - PullRequest
1 голос
/ 11 ноября 2010

Я написал свою bind функцию, которая возвращает нулевой функтор, потому что у меня нет повышения. Хотя этот код компилируется нормально, он не ведет себя так, как я ожидал. Когда я ввожу 2 в качестве числа чисел и пытаюсь ввести их, программа завершает работу в первый раз, когда я нажимаю клавишу возврата. И, когда я отлаживаю, происходит ошибка внутри mem_fun_t::operator(). Что я здесь не так делаю? И как это исправить?

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

1 Ответ

0 голосов
/ 11 ноября 2010

istream :: get - неправильный метод, так как он читает символы, а не целые. Вам нужно использовать оператор >> (и выбор правильной перегрузки очень многословно), или просто написать другой функтор:

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