boost::bindが返してくるファンクタ

boost::bindが返してくるファンクタの引数を過剰に与えるといらない部分は無視されるらしい(というか過剰に渡しても普通に動く)

#include <iostream>
#include <string>
#include <boost/bind.hpp>

struct Functor
{
	typedef void result_type;
	result_type operator()(std::string message){
		std::cout << message << std::endl;
	}
};

int main()
{
	Functor()("Hello");//通常の関数呼び出し
	//Functor()("Hello","Invailed Argument"); //引数の数が違うので呼び出せない

	//bindを使って関数を呼び出し
	boost::bind(Functor(),_1)("World");
	boost::bind(Functor(),"Hello")();

	//以下のどちらの呼び出しの方法でも過剰な引数が無視されるため実行できる
	boost::bind(Functor(),_1)("C++","Invailed Argument");
	boost::bind(Functor(),"World")("Invailed Argument");

	boost::bind(Functor(),_1)("1","2","3","4","5","6","7","8","9");
	//boost::bind(Functor(),_1)("1","2","3","4","5","6","7","8","9","10");//引数は9個まで

	return 0;
}

じゃあいったいbindは何を返しているんだ、ということでbindのソースのさわりの部分を見てみると
どうやら0〜9引数ごとにoperator()を書いておいて、渡された引数をリストにした後に、
boost::_bi::bind_tというクラスのコンストラクタにリストを渡して、そのbitd_tを返してきているらしい
このbind_tの中には実際のファンクタの引数の数とは関係なく、9引数までのoperator()が書かれているので、
多く引数を与えてもとりあえず呼び出すことができるみたい。


しかしboost::asioのチュートリアルはレベルが高い
こういう微妙な事をさも当たり前のように使うとは