プロジェクトの1つにを組み込みたいと思ってluabind
います。そのためには、call_function
(以下を参照)と同様に動作する関数を提供する必要があります。この関数は、いくつかのテンプレートマジック(Boostの提供)を使用しており、助けていただければ幸いです。テンプレートメタプログラミングに実際に出くわしたのはこれが初めてであり(それはそれが呼ばれているものですか?)、それで私は少し迷っています。助けていただければ幸いです。
#define LUABIND_TUPLE_PARAMS(z, n, data) const A##n *
#define LUABIND_OPERATOR_PARAMS(z, n, data) const A##n & a##n
このプリプロセッサビットが何をしているのかよくわかりません。それが何と呼ばれているのかさえわからないので、検索は少し難しいです。A
テンプレートタイプです。私が正しく覚えていれば#a
、の文字通りのテキストを挿入しますがa
、倍数は何をし#
ますか?このプリプロセッサのものの後にこれが来る。
template<class Ret BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A)>
typename boost::mpl::if_<boost::is_void<Ret>
, luabind::detail::proxy_function_void_caller<boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> >
, luabind::detail::proxy_function_caller<Ret, boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> > >::type
call_function(lua_State* L, const char* name BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_OPERATOR_PARAMS, _) )
{
typedef boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> tuple_t;
#if BOOST_PP_ITERATION() == 0
tuple_t args;
#else
tuple_t args(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), &a));
#endif
}
ご覧のとおり、Boostを多用しています。私はグーグルで検索しましBOOST_PP_ITERATION
たが、それでも実際に何をしているのか理解できません。誰かが私に、できればこのコードのコンテキストで、何をしているのBOOST_PP
か、そしてそれがどのように引数をに入れるのかを説明してもらえますかargs
?
私の最終目標はcall_function
、自分で定義args
するオーバーロードに渡すことができるコードを生成するコード内を定義することcall_function
です。これは、同じ呼び出し規約を使用できることを意味しますが、を呼び出す前にいくつかの前処理を適用することもできますluabind
。
この質問は、私が言った方法では非常に具体的ですが、ここで問題がないように、概念が十分に一般的であることを願っています。