Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> bind1st & bind2nd, опять запутался 
:(
    Опции темы
chaos
Дата 15.6.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Здравствуйте!
запутался опять с 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 кэширую а вторым будет передаваться сторока


Вчем заплет?


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

PM WWW   Вверх
mes
Дата 15.6.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



хм..думаю баг компилятора..(точнее не его, а стандартной библиотеки)

Добавлено @ 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)); 


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


Это сообщение отредактировал(а) mes - 15.6.2009, 14:50


--------------------
PM MAIL WWW   Вверх
chaos
Дата 15.6.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



так работает

Код

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

PM WWW   Вверх
azesmcar
Дата 15.6.2009, 14:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



chaos

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

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

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

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

Это сообщение отредактировал(а) azesmcar - 15.6.2009, 14:20
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.