13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
1

Использование bind2nd

23.06.2014, 00:22. Показов 13978. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи! Помогите, пожалуйста, разобраться с биндерами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <algorithm>
#include <iterator>
#include <functional>
#include <vector>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
typedef const int first_argument_type;
typedef const int second_argument_type;
typedef bool result_type;
 
result_type isBuzz(first_argument_type v, second_argument_type d);
 
int main() {
    srand(time(0));
    vector<int> vi(15);
    for (auto& x : vi) x = rand() % 100;
 
    //putting out unchanged values
    for (const auto& x : vi) cout << x << endl;
 
    //setting adapter
    const int d = 5;
    for_each(vi.cbegin(), vi.cend(), bind2nd(isBuzz(), d));
 
    //putting out changed values
    cout.fill ('_');
    for (const auto& x : vi) {
        cout.width(5);
        cout << x << endl;
    }
    return 0;
}
 
result_type isBuzz(first_argument_type v, second_argument_type d) {
    if (v%d == 0)
        return true;
    else
        return false;
}
Хотелось бы понять как правильно "тайпдефить" адаптируемую функцию?.. И поясните ошибку, плз:
clang++ -std=c++11 -O2 16_0.cxx
16_0.cxx:27:43: error: no matching function for call to 'isBuzz'
for_each(vi.cbegin(), vi.cend(), bind2nd(isBuzz(), d));
^~~~~~
16_0.cxx:15:13: note: candidate function not viable: requires 2 arguments, but 0 were provided
result_type isBuzz(first_argument_type v, second_argument_type d);
^
1 error generated.


Добавлено через 5 минут
А, итераторы уже сообразил - нужно begin() и end()! Но это все-равно сути не решает.
upd2. Уф, и первый аргумент должен быть не-const. Исправил.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2014, 00:22
Ответы с готовыми решениями:

Непонятки с bind2nd
Привет. Вот к примеру есть такой код: #include &lt;algorithm&gt; #include &lt;functional&gt; #include...

bind1st и bind2nd
Проблемы с std::bind1st и std::bind2nd Пишу такой код: void foo(int &amp;t, int &amp;t) { } int...

Отличие bind2nd от binder2nd
Привет. Чем отличается bind2nd (1st) от binder2nd (1st)? Первый - функция, а второй - функтор?...

Ошибка номер c2535 в адапторе bind2nd
Доброго времени суток начал изучать STL и пытаюсь соответственно активно использовать в...

23
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 00:35 2
Цитата Сообщение от andrejap Посмотреть сообщение
C++
1
bind2nd(isBuzz(), d)
C++
1
bind2nd(ptr_fun(isBuzz), d)
+ раз уж пользуетесь стандартом C++11, то стоит знать, что std::bind2nd и пр. объявлены deprecated (т.е. устаревшими) и предполагается использование std::bind:
C++
1
2
using namespace std::placeholders;
std::bind(isBuzz, _1, d)
Добавлено через 11 минут
Добавлю (на всякий случай), что во-первых, запись isBuzz() подразумевает, что происходит вызов функции (что тут не нужно), во-вторых, логика std::bind2nd предполагает, что первым аргументом является функциональный объект (с доступным operator () (first_argument_type, second_argument_type)), поэтому необходим wrapper (обёртка) указателя на функцию в функциональный объект (ptr_fun его генерирует).
1
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 00:44  [ТС] 3
gray_fox, спасибо за помощь! Файл скомпилировался, но у меня еще возник вопрос: в коде, который приведен ниже, я сделал так:
C++
1
auto binded_isBuzz = bind(isBuzz, _1, d);
Что за возвращаемый тип там должен быть? Почему bool нельзя?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <algorithm>
#include <iterator>
#include <functional>
#include <vector>
#include <cstdlib>
#include <ctime>
 
using namespace std;
using namespace std::placeholders;
bool isBuzz(int& v, const int& d);
 
int main() {
    srand(time(0));
    vector<int> vi(15), vii(15);
    for (auto& x : vi) x = rand() % 100;
 
    //putting out unchanged values
    for (const auto& x : vi) cout << x << endl;
 
    //setting adapter
    const int d = 5;
    auto binded_isBuzz = bind(isBuzz, _1, d);
    copy_if(vi.begin(), vi.end(), vii.begin(), binded_isBuzz);
 
    //putting out changed values
    cout.fill ('_');
    for (const auto& x : vii) {
        cout.width(5);
        cout << x << endl;
    }
    return 0;
}
 
bool isBuzz(int& v, const int& d) {
    if (v%d == 0)
        return true;
    else
        return false;
}
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 00:51 4
Цитата Сообщение от andrejap Посмотреть сообщение
Что за возвращаемый тип там должен быть? Почему bool нельзя?
Не понял; если интересует возвращаемый тип std::bind, то это будет некий функциональный объект, конкретный тип которого нет смысла знать (предполагается in place использование), который будет иметь примерно следующий оператор вызова функции:
C++
1
2
3
4
template<typename T>
constexpr bool operator(T && secondArgument) const {
   return holdedCallable(holdedFirstArgument, std::forward<T>(secondArgument));
}
1
andrejap
23.06.2014, 00:55  [ТС]
  #5

Не по теме:


Вот такой вот тип typeinfo::name() показывает:
St5_BindIFPFbRiRKiESt12_PlaceholderILi1EEiEE
:))
А что это может быть?


p.s.

Цитата Сообщение от gray_fox Посмотреть сообщение
если интересует возвращаемый тип std::bind
да

Ага - ясно теперь!) Вы мне очень помогли! Благодарю!

0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 00:58 6
Т.е. обычно это предполагается использовать так:
C++
1
 copy_if(vi.begin(), vi.end(), vii.begin(), bind(isBuzz, _1, d));

Не по теме:

Добавлено через 2 минуты

Цитата Сообщение от andrejap Посмотреть сообщение
А что это может быть?
Да х его з) Если интересно, там с помощью шаблонов классов рекурсивно "собирается" тип функционального объекта с нужными свойствами, его конкретный тип в стандарте не специфицирован, да и, вообще говоря, смысла знать этот конкретный тип нет.

1
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 01:02  [ТС] 7
gray_fox, да - так предполагается. Но мой вопрос относительно возвращаемого типа адаптора связан с тем, что как-то не хочу применять повсеместно auto, пока не буду знать точно, что выводится там автоматически. Спросил, чтобы разобраться что же там, если не bool.
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 01:22 8
Цитата Сообщение от andrejap Посмотреть сообщение
Но мой вопрос относительно возвращаемого типа адаптора связан с тем, что как-то не хочу применять повсеместно auto, пока не буду знать точно, что выводится там автоматически.
Там смысл в том, что ты будешь знать какими свойствами обладает адаптор (callable, сколько и каким образом передаются аргументы), но какой конкретный тип будет иметь этот адаптор тебе знать не надо; на разных компиляторах даю оценку 146% он будет совершенно разный. Если интересна реализация, то смотри исходники STL либо boost::bind (сразу скажу, вся эта "магия" относительно проста но здесь синтаксис С++ и правила оформления кода не для слабонервных.

Добавлено через 8 минут
+ учитывая сказанное, если ты собираешься сохранить результат std::bind, то обязательно используй auto в качестве спецификатора типа, т.к. возвращаемый тип не специфицирован стандартом языка.

Добавлено через 4 минуты
Цитата Сообщение от andrejap Посмотреть сообщение
Спросил, чтобы разобраться что же там, если не bool.
Там должен быть (если не запамятовал) не bool, а callable (вызываемая "сущность"), которая имеет тип возвращаемого значения, неявно приводимого к bool.
1
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 01:30  [ТС] 9
Цитата Сообщение от gray_fox Посмотреть сообщение
Если интересна реализация, то смотри исходники STL
Если бы знать, где тут они:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mrx@1015bx-suse:~/sources/gcc-4.8.3> ls -a
.                   COPYING          libada        libquadmath         Makefile.def
..                  COPYING3         libatomic     libsanitizer        Makefile.in
ABOUT-NLS           COPYING3.LIB     libbacktrace  libssp              Makefile.tpl
boehm-gc            COPYING.LIB      libcpp        libstdc++-v3        MD5SUMS
ChangeLog           COPYING.RUNTIME  libdecnumber  libtool-ldflags     missing
ChangeLog.tree-ssa  depcomp          libffi        libtool.m4          mkdep
compile             fixincludes      libgcc        ltgcc.m4            mkinstalldirs
config              gcc              libgfortran   ltmain.sh           move-if-change
config.guess        .gitignore       libgo         lt~obsolete.m4      NEWS
config-ml.in        gnattools        libgomp       lto-plugin          README
config.rpath        include          libiberty     ltoptions.m4        symlink-tree
config.sub          INSTALL          libitm        ltsugar.m4          ylwrap
configure           install-sh       libjava       ltversion.m4        zlib
configure.ac        intl             libmudflap    MAINTAINERS
contrib             LAST_UPDATED     libobjc       maintainer-scripts
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 01:46 10
Цитата Сообщение от andrejap Посмотреть сообщение
Если бы знать, где тут они:
Найди, где у тебя находится <functional> (find <your_g++_include_dir> -name functional) и проследи цепочку include-ов.

Добавлено через 5 минут
Например у меня (Винда + MinGW_4.8.0) определение std::bind находится в <functional>.
1
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 01:53  [ТС] 11
gray_fox, ну эт я напамять помню: /usr/include/c++/functional .Днем посмотрю уже с компа, а то пишу со смарта.
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 01:57 12

Не по теме:

Если что, MinGW - это "минимальный" порт для разработчика, который включает gcc/g++ порт под Windows.



Добавлено через 2 минуты
Цитата Сообщение от andrejap Посмотреть сообщение
ну эт я напамять помню: /usr/include/c++/functional
Смотри его, наверняка все определения в этом заголовочном файле; если нет, то смотри цепочки include-ов, они обычно имеют вполне понятные имена.
1
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 01:58  [ТС] 13
gray_fox, mingw - это для cygwin или можно его и в разных ide использовать?
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 02:07 14
andrejap, можно в разных IDE, MinGW - это минимальный порт (Cygwin его использует). Например, я использую на Винде NetBeans + MinGW_8.0 для личных проектов, Cygwin иметь для этого не обязательно, MinGW в базовой конфигурации даст тебе возможность использовать большинство языков, поддерживаемых GCC.
0
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 02:12  [ТС] 15
gray_fox, использовать где? Не в NetBeans же? Я почему спрашиваю - саю использую netbeans; туда же (в netbeans) gccgo не подключишь? Или на windows такое прокатывает с netbeans+mingw?
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 02:18 16
andrejap, если ты под Linux используешь NetBeans, наверняка ты используешь g++ (либо clang++), MinGW - это порт gcc (и, соответственно, g++) под Win.
0
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 02:25  [ТС] 17
gray_fox, да, выбираю либо то, либо то. Просто из-за информативности вывода, на силенге он еще и цветной в терминале.

Спасибо большое за инфу! Узнал много новой информации! Доброй ночи!
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
23.06.2014, 02:30 18
Цитата Сообщение от andrejap Посмотреть сообщение
Просто из-за информативности вывода, на силенге он еще и цветной в терминале.
Да, clang пока рулит в плане информативности + у них есть своя виртуальная машина, которая может пригодиться для разработки своих нативных\JIT языков; см. http://llvm.org/.
0
Jupiter
23.06.2014, 02:31
  #19

Не по теме:

Цитата Сообщение от andrejap Посмотреть сообщение
C++
1
2
3
4
if (v%d == 0)
* * * * return true;
* * else
* * * * return false;
C++
1
return v % d == 0;

0
13 / 13 / 7
Регистрация: 21.04.2013
Сообщений: 245
23.06.2014, 23:31  [ТС] 20
gray_fox, ага, вижу - в самом хедере определение есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /**
   *  @brief Function template for std::bind.
   *  @ingroup binders
   */
  template<typename _Func, typename... _BoundArgs>
    inline typename
    _Bind_helper<__is_socketlike<_Func>::value, _Func, _BoundArgs...>::type
    bind(_Func&& __f, _BoundArgs&&... __args)
    {
      typedef _Bind_helper<false, _Func, _BoundArgs...> __helper_type;
      typedef typename __helper_type::__maybe_type __maybe_type;
      typedef typename __helper_type::type __result_type;
      return __result_type(__maybe_type::__do_wrap(std::forward<_Func>(__f)),
               std::forward<_BoundArgs>(__args)...);
    }
Возвращает какой-то __helper_type::type.
Интересно еще - что значит вторая строчка:
C++
1
inline typename
?
0
23.06.2014, 23:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2014, 23:31
Помогаю со студенческими работами здесь

Забиндить второй аргумент функции, используя std::bind2nd
Как забиндить свою функцию с двумя аргументами в функцию с одним аргументом? Вот пример в котором...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между...

Создание и использование своих @NamedQueries. Использование EntityManager
Добрый день! Создавал классы сущностей и сессий через NetBeans генераторы кода. Использование...

Задачи на использование событий. Осуществить использование событий в программе с применением синтаксиса обработчика, рекомендованного для среды NET Fr
NET Framework. Программа для поиска простых чисел среди чисел Фибоначчи. При нахождении...

Использование строк.Использование структур
Задачка: Дана строка,состоящая из групп нулей и едениц. Найти и вывести на экран группы с нечетным...

Использование функций, использование break
Здравствуйте. Не знал как назвать тему, боялся что, если назову &quot;КАК ЭТО РАБОТАЕТ?&quot; то её удалят....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru