On Tue, Oct 28, 2025 at 4:41 PM Lipódi László via Boost-users <[email protected]> wrote: > > Hi! > > According to > https://www.boost.org/doc/libs/latest/doc/html/boost_asio/reference/read_until/overload16.html > > "The default implementation of the is_match_condition type trait evaluates to > true for function pointers and function objects with a result_type typedef. > It must be specialised for other user-defined function objects." > > On Tuesday, October 28th, 2025 at 15:31, Klebsch, Mario via Boost-users > <[email protected]> wrote: > > > Hello, > > > > I want to use boost::asio::read_until() and pass a functor as match > > condition. But I don't get it to compile. > > > > Here is my source code: > > > > #include <boost/asio.hpp> > > > > > > using namespace boost::asio; > > using iterator = buffers_iteratorstreambuf::const_buffers_type; > > > > > > struct completion_functor > > { > > std::pair<iterator, bool> operator()(iterator begin, iterator end) { > > > > return {}; > > } > > }; > > completion_functor functor; > > static_assert(is_match_condition<completion_functor>::value, > > "completion_functor must be match condition"); > > > > static_assert(is_match_condition<decltype(functor)>::value, "functor must > > be match condition"); > > > > > > std::pair<iterator, bool> completion_func(iterator begin, iterator end) { > > > > return functor(begin, end); > > } > > static_assert(is_match_condition<decltype(completion_func)>::value, > > "completion_func must be match condition"); > > > > > > > > auto lambda = [](iterator begin, iterator end) -> std::pair<iterator, bool> > > { > > > > return {}; > > }; > > static_assert(is_match_condition<decltype(lambda)>::value, "lambda must be > > match condition"); > > > > > > std::pair<iterator, bool> completion_func2(iterator begin, iterator end) { > > > > return lambda(begin, end); > > } > > static_assert(is_match_condition<decltype(completion_func2)>::value, > > "completion_func2 must be match condition"); > > > > > > > > int main(int argc, char *argv[]) > > { > > io_context ctx; > > ip::tcp::socket s{ctx}; > > streambuf buffer; > > > > read_until(s, buffer, '\n'); > > read_until(s, buffer, completion_func); > > read_until(s, buffer, completion_func2); > > // the following calls do not compile > > // read_until(s, buffer, functor); > > // read_until(s, buffer, lambda); > > } > > > > It seems, that boost::asio::is_match_condition<> does neither accept my > > lammda-function nor my functor. The only completion handler, that I get > > accepted, is a classic, free-standing function (and static class member > > functions, too). > > > > > > But in that function, calling the lambda or the functor does not seem to be > > a problem for the compiler. > > > > The documentation of read_until describes match_condition as "The function > > object to be called to determine whether a match exists." > > > > I would expect lambda functions and functors to be accepted as a function > > object. > > > > Do I have an error in the declaration of lambda or > > completion_functor::operator()? > > > > Does anybody now, how to get this working? > > > > I tried boost_1_73_0 and boost_1_88_0 with g++ (Gentoo 14.3.1_p20250801 p4) > > 14.3.1 20250801 and clang version 20.1.8 > > > > Thanks in advance, > > > > Klebsch Mario > > Funktion | R&D > > > > > > > > Tel: +49 (0) 531 38 701 718 > > Raum: Braunschweig, E20 > > > > > > > > Diese E-Mail und die an sie angehängten Dateien sind ausschließlich für > > Personen oder Institutionen bestimmt, deren Namen oben aufgeführt sind. Sie > > können Informationen enthalten, die durch das Berufsgeheimnis geschützt > > sind und deren Weitergabe strengstens untersagt ist. Jede elektronische > > Nachricht kann geändert werden. ACTIA lehnt jede Verantwortung für diese > > Nachricht ab. Der Inhalt dieser Nachricht stellt keine Verpflichtung > > seitens unseres Unternehmens dar. Wenn Sie kein Empfänger sind, weisen wir > > Sie darauf hin, dass das Lesen, Vervielfältigen oder Verteilen strengstens > > untersagt ist. Wir bitten Sie daher, uns umgehend über diesen Brief zu > > informieren und diese Nachricht sowie eventuell beigefügte Unterlagen aus > > Ihrem Postfach zu löschen. Danke. > > > > This e-mail and the files attached to it are intended exclusively for > > persons or institutions whose names are listed above. They may contain > > information that is protected by professional secrecy and the disclosure of > > which is strictly prohibited. Any electronic message can be modified. ACTIA > > declines all responsibility for this message. The content of this message > > does not represent a commitment on the part of our company. If you are not > > a recipient, we would like to point out that reading, copying or > > distribution is strictly prohibited. We therefore ask you to inform us > > immediately about this letter and to delete this message and any > > accompanying documents from your mailbox. Thank you. > > > > > > > > _______________________________________________ > > Boost-users mailing list -- [email protected] > > To unsubscribe send an email to [email protected] > > https://lists.boost.org/mailman3/lists/boost-users.lists.boost.org/ > > Archived at: > > https://lists.boost.org/archives/list/[email protected]/message/EFS3KB5CF4OT2FHLELO43GRZR4W6RWLY/ > _______________________________________________ > Boost-users mailing list -- [email protected] > To unsubscribe send an email to [email protected] > https://lists.boost.org/mailman3/lists/boost-users.lists.boost.org/ > Archived at: > https://lists.boost.org/archives/list/[email protected]/message/F3RQRD44ZSLIPUCOQEZYO4VZA6CYNEPT/
Hi there, According to the example in the docs here - https://www.boost.org/doc/libs/latest/doc/html/boost_asio/reference/read_until/overload7.html You need to specialize the class template - boost::asio::is_match_condition for your functor types. Adding this to your example code makes it work - https://godbolt.org/z/7sTsv5hKK ``` namespace boost::asio { template <> struct is_match_condition<completion_functor> : public std::true_type {}; template <> struct is_match_condition<decltype(lambda)> : public std::true_type {}; } ``` Pavel. _______________________________________________ Boost-users mailing list -- [email protected] To unsubscribe send an email to [email protected] https://lists.boost.org/mailman3/lists/boost-users.lists.boost.org/ Archived at: https://lists.boost.org/archives/list/[email protected]/message/YJGR355I7266UJKNQHNCMVUVPRBBBXCP/
