Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
1

Особенности бинда перегруженных шаблонных методов класса

24.10.2017, 12:02. Показов 1029. Ответов 6

Author24 — интернет-сервис помощи студентам
Привет! Есть бустовый сокет, хочу некоторые его методы запихать в std::function. Методы шаблонные, перегруженные.
Желаю заюзать, к примеру, эту перегрузку:
C++
1
2
3
4
5
6
7
8
9
10
11
// кусок бустового класса
  template <typename MutableBufferSequence>
  std::size_t receive(const MutableBufferSequence& buffers)
  {
    boost::system::error_code ec;
    std::size_t s = this->get_service().receive(
        this->get_implementation(), buffers, 0, ec);
    boost::asio::detail::throw_error(ec, "receive");
    return s;
  }
//...
Делаю, так:
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
#include <iostream>
#include <functional>
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
 
using boost::asio::ip::udp;
using boost::asio::io_service;
using boost::asio::buffer;
using boost::system::error_code;
using boost::asio::ip::address;
 
using namespace std;
 
int main()
{
    io_service m_io_service;
    udp::socket sock(m_io_service, udp::endpoint(address::from_string("127.0.0.1"), 44000));
 
    std::function<std::size_t(boost::asio::mutable_buffer)> f;
    f = std::bind(
        static_cast< std::size_t(udp::socket::*)(boost::asio::mutable_buffer) >(&udp::socket::receive),
        &sock, std::placeholders::_1
         );
 
    cout << "lol\n";
    cin.get();
    return 0;
}
шланг, не умеющий в с++14, говорит:
address of overloaded function 'receive' cannot be static_cast to type 'std::size_t (socket::*)(boost::asio::mutable_buffer)'
basic_datagram_socket.hpp(603): candidate function
basic_datagram_socket.hpp(631): candidate function
basic_datagram_socket.hpp(660): candidate function
Как правильно ему объяснить, чего я хочу?)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2017, 12:02
Ответы с готовыми решениями:

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса)
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1;...

Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным ...

Можно ли сделать 1 шаблонный псевдоним на 2 разных шаблонных класса?
Например, есть шаблон работающий с числами - Number, и другой со строками - String. Задача -...

Decltype при определении возвращаемого типа в перегруженных операторах шаблонного класса
Для всех следующих примеров будет использован main(): #include &lt;iostream&gt; int main() {...

6
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
24.10.2017, 13:03 2
так тоже не работает?
C++
1
auto f = std::bind(&udp::socket::receive, &sock, std::placeholders::_1);
в доке сигнатура метода receive такая: std::size_t receive(const MutableBufferSequence & buffers);
0
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
24.10.2017, 13:20 3
Я что-то не пойму ,что к чему вы там кастуете?..
И скобок явно не хватает

Добавлено через 8 минут
Пардон, прокруткой не воспользовался.. ))))
0
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
24.10.2017, 13:21  [ТС] 4
Operok, неа.
File1.cpp(37): no matching function for call to 'bind'
Методов "ресив" там чуть больше, чем несколько и все они шаблонные. У компиля сносит крышу, какой из них биндить. На стэковерфлоу прочиталось, что можно явно прикастовать его к нужной сигнатуре и радоваться. Но там это говориться применительно к перегрузкам нешаблонных методов. А тут, походу, шаблон лепту еще вносит и так просто не пропускает.
Пока пришел к тому, что обернуть этот ресив в лямбду и ее уже биндить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    io_service m_io_service;
    udp::socket sock(m_io_service, udp::endpoint(address::from_string("127.0.0.1"), 44000));
 
    typedef std::vector<unsigned char> buffer_t;
 
    std::function<std::size_t(udp::socket&, buffer_t&)> lambda;
    lambda = [](udp::socket& s, buffer_t& buf) -> std::size_t
    {
        return s.receive(boost::asio::buffer(buf));
    };
 
    auto f = std::bind(&lambda,  &sock, std::placeholders::_1);
 
    cout << "lol\n";
    cin.get();
    return 0;
}
Только вот не могу понять, какой тип выводится из "auto". Авто не могу оставить
0
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
24.10.2017, 13:25 5
Передай f куда-нибудь не туда. Компилятор тебе скажет ее тип.
А вообще, тип твоей лямбды должен быть
0
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
24.10.2017, 14:56  [ТС] 6
Pink_Pank, хитро, но там тоже плохочитаемая портянка)
В общем, чуток вспотел и вроде как сделал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    typedef std::vector<unsigned char> buf_t;
 
    io_service m_io_service;
    udp::socket s(m_io_service, udp::endpoint(address::from_string("127.0.0.1"), 44000));
 
    std::function<std::size_t(udp::socket*, buf_t&)> lambda;
    lambda = [](udp::socket* s, buf_t& a) -> std::size_t
    {
        return s->receive(boost::asio::buffer(a));
    };
 
    std::function< std::size_t(buf_t&) > f;
    f = std::bind(lambda, &s, std::placeholders::_1);
 
    buf_t buf;
    f(buf);
 
    return 0;
}
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
24.10.2017, 15:10 7
к чему столько лишних обёрток
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    typedef std::vector<unsigned char> buf_t;
 
    io_service m_io_service;
    udp::socket s(m_io_service, udp::endpoint(address::from_string("127.0.0.1"), 44000));
 
    auto f = [](udp::socket* s, buf_t& a) -> std::size_t
    {
        return s->receive(boost::asio::buffer(a));
    };
 
    buf_t buf;
    f(buf);
 
    return 0;
}
0
24.10.2017, 15:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2017, 15:10
Помогаю со студенческими работами здесь

Как вынести описание методов вложенного класса за пределы класса?
Подскажите, пожалуйста, как мне вынести описание методов вложенного класса за пределы класса?

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h в котором храню...

Вызов методов класса из двойного указателя на экземпляр класса
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct...

Работа перегруженных методов
Здравствуйте. Ребят, помогите пожалуйста разобраться с задачкой. Изначально у меня было такое...


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

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