LINUX.ORG.RU

Коллбэк, std::bind и проблемы с возвращаемым значением.

 , , ,


0

1

Есть такой кот:

#inculde <functional>
using namespace std::placeholders;

struct A
{
    using Callback = std::function<int(int value)>;
    void someFunc(Callback callback) {

    }
};

struct B
{
    B() {
        A a;
        a.someFunc(std::bind(&B::func, this, _1));
    }

    void func(int value) {

    }
};

Понятное дело, кот не компилируется, ибо сигнатура коллбэка и B::func различаются возвращаемым значением. Вопрос - можно биндами такое обойти? Лямбду не хочется юзать, ибо громоздко получается.

только оберткой. Неважно какой бинд или лямбда, или замена B::func. в любом случае тебе нужно вернуть int, если уж обещал.

anonymous ()

Громоздко хаха прекрати что ты делаешь.

anonymous ()
Ответ на: комментарий от hlebushek

Некрасиво получается в таком случае:

..........
using Callback = std::function<int(const FirstNamespace::FirstLongClassName &firstClass, const SecondNamespace::SecondLongClassName &secondClass, const ThirdNamespace::ThirdLongClassName &thirdClass)>;
..................
a.someFunc(std::bind(&B::func, this, 
[] (const FirstNamespace::FirstLongClassName &firstClass, const SecondNamespace::SecondLongClassName &secondClass, const ThirdNamespace::ThirdLongClassName &thirdClass) {
Q_UNUSED(firstClass)
Q_UNUSED(secondClass)
Q_UNUSED(thirdClass)
someFunc();
return 0;
}
));

В бинде параметры просто проигнорятся.

panter_dsd ★★★★ ()
Ответ на: комментарий от panter_dsd
#include <functional>
using namespace std::placeholders;

struct A
{
    using Callback = std::function<int(int value)>;
    void someFunc(Callback callback) {

    }
};

struct B
{
    B() {
        A a;
        a.someFunc([&](int value) { func(value); return 0xF00; });
    }

    void func(int value) {

    }
};
hlebushek ★★ ()
Ответ на: комментарий от anonymous

Gcc ошибку выдает.

/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/functional:2024: error: cannot pass objects of non-trivially-copyable type 'const struct CopRouterAddress' through '...'
  return (*_Base::_M_get_pointer(__functor))(
          ^

panter_dsd ★★★★ ()
Ответ на: комментарий от panter_dsd

А точно. Сэр, это я гоню.

Тогда писать обертку отдельно с шаблонами =) Но чтоб совсем красиво...не знаю. сейчас кофе налью, потыкаю, мож кто еще подскажет.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.