Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

then() continuation not playing well with std::bind_front #1884

Open
germandiagogomez opened this issue Dec 21, 2023 · 3 comments
Open

then() continuation not playing well with std::bind_front #1884

germandiagogomez opened this issue Dec 21, 2023 · 3 comments

Comments

@germandiagogomez
Copy link

Hello everyone,

It seems I cannot use std::bind_front with then() continuations when an equivalent (AFAIK) lambda will do.

Example that fails

auto wsock = response.acceptWebSocket(headers);
        return wsock->receive().then(std::bind_front(
            &WebsocketService::handleMessage, this, std::move(wsock)));

Example that works

auto wsock = response.acceptWebSocket(headers);
        return wsock->receive().then(
            [this,
             ws = std::move(wsock)](kj::WebSocket::Message &&message) mutable {
              return handleMessage(std::move(ws), std::move(message));
            });

Error

/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:504:22: error: no matching function for call to object of type 'std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>'
    typedef decltype(func(instance<ParamTypes>()...)) ReturnType;
                     ^~~~
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:1085:76: note: in instantiation of function template specialization 'kj::_::GetFunctorStartAddress<kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&>::apply<std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>> &>' requested here
  void* continuationTracePtr = _::GetFunctorStartAddress<_::FixVoid<T>&&>::apply(func);
                                                                           ^
../programs/websocket-server/main.cpp:65:33: note: in instantiation of function template specialization 'kj::Promise<kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>>::then<std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, kj::_::PropagateException>' requested here
        return wsock->receive().then(std::bind_front(
                                ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:48:46: note: candidate function template not viable: expects an rvalue for object argument
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) &&
                                             ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:57:46: note: candidate function template not viable: expects an rvalue for object argument
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) const&&
                                             ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:36:46: note: candidate template ignored: substitution failure [with _Args = <kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>>]: no matching function for call to '__call'
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) &
                                             ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:42:46: note: candidate template ignored: substitution failure [with _Args = <kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>>]: no matching function for call to '__call'
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) const&
                                             ^
In file included from ../programs/websocket-server/main.cpp:2:
In file included from /Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async.h:1188:
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:505:12: error: no matching function for call to 'from'
    return PtmfHelper::from<ReturnType, Decay<Func>, ParamTypes...>(
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:465:21: note: candidate function [with R = int, C = std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, P = <kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&>] not viable: no overload of 'operator()' matching 'int (std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>::*)(NoInfer<kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&>)' for 1st argument
  static PtmfHelper from(R (C::*p)(NoInfer<P>...)) { BODY; }
                    ^
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:467:21: note: candidate function [with R = int, C = std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, P = <kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&>] not viable: no overload of 'operator()' matching 'int (std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>::*)(NoInfer<kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&>) const' for 1st argument
  static PtmfHelper from(R (C::*p)(NoInfer<P>...) const) { BODY; }
                    ^
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:459:21: note: candidate template ignored: couldn't infer template argument 'F'
  static PtmfHelper from(F p) { BODY; }
                    ^
In file included from ../programs/websocket-server/main.cpp:2:
In file included from /Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async.h:24:
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-prelude.h:156:12: error: no matching function for call to object of type 'std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>'
    return func(kj::mv(in));
           ^~~~
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:566:57: note: in instantiation of function template specialization 'kj::_::MaybeVoidCaller<kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>, kj::Promise<void>>::apply<std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>>' requested here
      output.as<T>() = handle(MaybeVoidCaller<DepT, T>::apply(func, kj::mv(*depValue)));
                                                        ^
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:542:3: note: in instantiation of member function 'kj::_::TransformPromiseNode<kj::Promise<void>, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>, std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, kj::_::PropagateException>::getImpl' requested here
  TransformPromiseNode(Own<PromiseNode>&& dependency, Func&& func, ErrorFunc&& errorHandler,
  ^
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/memory.h:469:21: note: in instantiation of member function 'kj::_::TransformPromiseNode<kj::Promise<void>, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>, std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, kj::_::PropagateException>::TransformPromiseNode' requested here
  return Own<T>(new T(kj::fwd<Params>(params)...), _::HeapDisposer<T>::instance);
                    ^
/Users/myuser/.conan/data/capnproto/0.10.3/_/_/package/13b953c004db54b2d9cf274425004a3d521cf731/include/kj/async-inl.h:1087:7: note: in instantiation of function template specialization 'kj::heap<kj::_::TransformPromiseNode<kj::Promise<void>, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>, std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, kj::_::PropagateException>, kj::Own<kj::_::PromiseNode>, std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, kj::_::PropagateException, void *&>' requested here
      heap<_::TransformPromiseNode<ResultT, _::FixVoid<T>, Func, ErrorFunc>>(
      ^
../programs/websocket-server/main.cpp:65:33: note: in instantiation of function template specialization 'kj::Promise<kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>>::then<std::__perfect_forward_impl<std::__bind_front_op, std::__tuple_types<kj::Promise<void> (WebsocketService::*)(kj::Own<kj::WebSocket> &&, kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close> &&), WebsocketService *, kj::Own<kj::WebSocket>>, std::__tuple_indices<0, 1, 2>>, kj::_::PropagateException>' requested here
        return wsock->receive().then(std::bind_front(
                                ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:48:46: note: candidate function template not viable: expects an rvalue for object argument
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) &&
                                             ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:57:46: note: candidate function template not viable: expects an rvalue for object argument
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) const&&
                                             ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:36:46: note: candidate template ignored: substitution failure [with _Args = <kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>>]: no matching function for call to '__call'
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) &
                                             ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__functional/perfect_forward.h:42:46: note: candidate template ignored: substitution failure [with _Args = <kj::OneOf<kj::String, kj::Array<unsigned char>, kj::WebSocket::Close>>]: no matching function for call to '__call'
    _LIBCPP_INLINE_VISIBILITY constexpr auto operator()(_Args&&... __args) const&
@kentonv
Copy link
Member

kentonv commented Dec 21, 2023

What is the signature of your WebsocketService::handleMessage?

It looks to me like bind_front doesn't believe the arguments you have provided fit that function. Maybe try saving the result of bind_front to a local and verify it is actually callable with a WebSocket::Message -- I suspect it isn't.

@germandiagogomez
Copy link
Author

@kentonv

kj::Promise<void> MyWebSocketService::handleMessage(kj::Own<kj::WebSocket> &&ws,
                                  kj::WebSocket::Message &&message);

@kentonv
Copy link
Member

kentonv commented Dec 22, 2023

Sorry but I don't have bandwidth to debug this. If there's a simple change that we could make to fix this I'm happy to accept a PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants