この例とasync_read
マニュアルには矛盾があります。async_read
手動ハンドラーによると、エラー コードと転送されたバイト数の 2 つの引数が必要ですが、この例では、ハンドラーはエラー コードのみを受け入れます。ここで何が起こっているのですか?
質問する
498 次
2 に答える
2
からの結果の型は、依然としてReadHandlerboost::bind
の要件を満たしています。 Boost.Bindのドキュメントには、余分な引数は黙って無視されると記載されています。
たとえば、Boost.Asio の内部では、ReadHandler 呼び出しチェーンは次のようになります。
handler( error, bytes_transferred )
`-- binder::operator()( error, bytes_transferred )
`-- bound_function( error )
のより良い図と説明については、このブログ エントリbind
を読むことを検討してください。その図の 1 つは、過剰な引数の場合を具体的に示しています。
于 2013-01-10T22:57:07.457 に答える
1
大丈夫なので、N個を超える引数を使用してバインドオブジェクトoperator()を呼び出します。
#include <iostream>
#include <boost/bind.hpp>
template<typename T>
void call(const T& f)
{
f(1, 2, 3, 4);
}
void f(int i) { std::cout << i << std::endl; }
int main()
{
call(boost::bind(&f, 1));
}
http://liveworkspace.org/code/1MrPTQ $ 2
template<class R, class F, class L> class bind_t
{
public:
typedef bind_t this_type;
bind_t(F f, L const & l): f_(f), l_(l) {}
#define BOOST_BIND_RETURN return
#include <boost/bind/bind_template.hpp>
#undef BOOST_BIND_RETURN
};
result_type operator()()
{
list0 a;
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
result_type operator()() const
{
list0 a;
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
template<class A1> result_type operator()(A1 & a1)
{
list1<A1 &> a(a1);
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
template<class A1> result_type operator()(A1 & a1) const
{
list1<A1 &> a(a1);
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9)
{
list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) const
{
list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
template<class R, class F, class A1>
_bi::bind_t<R, F, typename _bi::list_av_1<A1>::type>
BOOST_BIND(F f, A1 a1)
{
typedef typename _bi::list_av_1<A1>::type list_type;
return _bi::bind_t<R, F, list_type> (f, list_type(a1));
}
そして、例えば、boost :: bi :: list1の実現operator()
template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
{
return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
}
実際に提供された要素の数に関係なく、1つの引数でfを呼び出します。
于 2013-01-10T12:26:15.253 に答える