#include <iostream>
#include <functional>
struct protocol_callbacks
{
using func_t = std::function<int(uint8_t*, size_t)>;
protocol_callbacks(func_t a_reader, func_t a_writer) :
reader(a_reader),
writer(a_writer) {}
func_t reader;
func_t writer;
};
int writer(uint8_t*, size_t)
{
std::cout << "function writer\n";
return 0;
}
int reader(uint8_t*, size_t)
{
std::cout << "function writer\n";
return 0;
}
int bad_writer(uint16_t*, size_t) { return 0; }
int main ()
{
int x = 9;
protocol_callbacks pc1(reader, writer);
protocol_callbacks pc2([=](uint8_t*, size_t)
{
std::cout << "lambda reader: " << x << "\n";
return 0;
},
[=](uint8_t*, size_t)
{
std::cout << "lambda writer: " << x << "\n";
return 0;
});
pc1.reader(nullptr, 0);
pc1.writer(nullptr, 0);
pc2.reader(nullptr, 0);
pc2.writer(nullptr, 0);
protocol_callbacks pc3(bad_writer, reader);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBwcm90b2NvbF9jYWxsYmFja3MKewogICAgdXNpbmcgZnVuY190ID0gc3RkOjpmdW5jdGlvbjxpbnQodWludDhfdCosIHNpemVfdCk+OwoKICAgIHByb3RvY29sX2NhbGxiYWNrcyhmdW5jX3QgYV9yZWFkZXIsIGZ1bmNfdCBhX3dyaXRlcikgOgogICAgICAgIHJlYWRlcihhX3JlYWRlciksCiAgICAgICAgd3JpdGVyKGFfd3JpdGVyKSB7fQogICAgZnVuY190IHJlYWRlcjsKICAgIGZ1bmNfdCB3cml0ZXI7Cn07CgppbnQgd3JpdGVyKHVpbnQ4X3QqLCBzaXplX3QpCnsKICAgIHN0ZDo6Y291dCA8PCAiZnVuY3Rpb24gd3JpdGVyXG4iOwogICAgcmV0dXJuIDA7Cn0KaW50IHJlYWRlcih1aW50OF90Kiwgc2l6ZV90KQp7CiAgICBzdGQ6OmNvdXQgPDwgImZ1bmN0aW9uIHdyaXRlclxuIjsKICAgIHJldHVybiAwOwp9CgppbnQgYmFkX3dyaXRlcih1aW50MTZfdCosIHNpemVfdCkgeyByZXR1cm4gMDsgfQoKaW50IG1haW4gKCkKewogICAgaW50IHggPSA5OwogICAgcHJvdG9jb2xfY2FsbGJhY2tzIHBjMShyZWFkZXIsIHdyaXRlcik7CiAgICBwcm90b2NvbF9jYWxsYmFja3MgcGMyKFs9XSh1aW50OF90Kiwgc2l6ZV90KQogICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImxhbWJkYSByZWFkZXI6ICIgPDwgeCA8PCAiXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XSh1aW50OF90Kiwgc2l6ZV90KQogICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImxhbWJkYSB3cml0ZXI6ICIgPDwgeCA8PCAiXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgIHBjMS5yZWFkZXIobnVsbHB0ciwgMCk7CiAgICBwYzEud3JpdGVyKG51bGxwdHIsIDApOwoKICAgIHBjMi5yZWFkZXIobnVsbHB0ciwgMCk7CiAgICBwYzIud3JpdGVyKG51bGxwdHIsIDApOwogICAgcHJvdG9jb2xfY2FsbGJhY2tzIHBjMyhiYWRfd3JpdGVyLCByZWFkZXIpOwp9Cg==
In file included from prog.cpp:2:0:
/usr/include/c++/4.7/functional: In instantiation of ‘static _Res std::_Function_handler<_Res(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Res = int; _Functor = int (*)(short unsigned int*, unsigned int); _ArgTypes = {unsigned char*, unsigned int}]’:
/usr/include/c++/4.7/functional:2298:6: required from ‘std::function<_Res(_ArgTypes ...)>::function(_Functor, typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type) [with _Functor = int (*)(short unsigned int*, unsigned int); _Res = int; _ArgTypes = {unsigned char*, unsigned int}; typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type = std::function<int(unsigned char*, unsigned int)>::_Useless]’
prog.cpp:48:46: required from here
/usr/include/c++/4.7/functional:1912:40: error: cannot convert ‘unsigned char*’ to ‘short unsigned int*’ in argument passing