Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > bind1st & bind2nd


Автор: chaos 15.6.2009, 12:08
Здравствуйте!
запутался опять с bind1st и bind2st
Код

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>


class object_t
{
public:
    void test(const std::string& text)
    {
        std::cout << text << std::endl;
    }
};

int main()
{
    std::vector<std::string> string_array;
    string_array.push_back("6");
    string_array.push_back("7");
    string_array.push_back("8");
    
    object_t *o = new object_t;


    std::string text = "text";
    std::mem_fun(&object_t::test)(o, text);

    return 0;
}


работает нормально

но если вставляю строчку
Код

std::for_each(string_array.begin(), string_array.end(), std::bind1st(std::mem_fun(&object_t::test), o));    


то компиллер ругается.

вроде делаю все правильно: первый аргумент mem_fun кэширую а вторым будет передаваться сторока


Вчем заплет?


Заранее благодарен!

Автор: mes 15.6.2009, 13:04
хм..думаю баг компилятора..(точнее не его, а стандартной библиотеки)

Добавлено @ 13:05
если метод объявить  как void test(std::string text); то работает, иначе формирует ссылку на ссылку.

Добавлено @ 13:10
скопировал описание биндера, убрав ссылку у параметра оператора () :
Код

namespace std {
template <class Operation> class my_binder1st
  : public unary_function <typename Operation::second_argument_type,
                           typename Operation::result_type>
{
protected:
  Operation op;
  typename Operation::first_argument_type value;
public:
  my_binder1st ( const Operation& x,
              const typename Operation::first_argument_type& y) : op (x), value(y) {}
  typename Operation::result_type
    operator() (const typename Operation::second_argument_type x) const // <-- было: second_argument_type& x
    { return op(value,x); }
};

template <class Operation, class T>
  my_binder1st<Operation> my_bind1st (const Operation& op, const T& x)
{
  return my_binder1st<Operation>(op, typename Operation::first_argument_type(x));
}
}

с таким кодом работает :

Код

 std::for_each(string_array.begin(), string_array.end(), std::my_bind1st(std::mem_fun(&object_t::test), o)); 


имхо, недоделка стл. 

Автор: chaos 15.6.2009, 13:11
так работает

Код

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>


class object_t
{
public:
    void test(std::string text)
    {
        std::cout << text << std::endl;
    }
};

int main()
{
    std::vector<std::string> string_array;
    string_array.push_back("6");
    string_array.push_back("7");
    string_array.push_back("8");
    
    object_t *o = new object_t;

    std::for_each(string_array.begin(), string_array.end(), std::bind1st(std::mem_fun(&object_t::test), o));    
    delete o;

    return 0;
}



Добавлено через 49 секунд
зы все что сделал, так это убрал const в параметре метода test
а что мешало с конст - не понимаю smile

Добавлено через 3 минуты и 14 секунд
ЗЫ и еще передачу по ссылке убрал

Добавлено через 6 минут и 7 секунд
mes, 
Код

chaos@penguin:~/tmp$ gcc --version
gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


на счет недоделки smile тоже так думаю

Добавлено через 7 минут и 5 секунд
ЗЫ boost::bind рулит имхо smile

Код

std::for_each(string_array.begin(), string_array.end(), boost::bind(&object_t::test, o, _1));

Автор: azesmcar 15.6.2009, 14:15
chaos

оператор () для структуры binary_function возвращаемой std::bind1st принимает константную ссылку на тип как аргумент. Поскольку тип там ссылка на std::string, получится ссылка на ссылку, такого не бывает. Компилятор не виноват.

вот так будет нагляднее
Цитата

std::bind1st(std::mem_fun<void, object_t, const std::string&>(&object_t::test), o);

хм...уже было, недоглядел smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)