我想將luabind
合併到我的一個項目中。爲此,我需要提供一個與call_function
類似的功能(見下文)。這個函數使用了一些模板魔法(禮貌的提升),我會感謝一些幫助。這是我第一次真正遇到模板元編程(就是它被稱爲?),所以我有點迷路。這裏有幾個我會感謝幫助的片段。對於可變長度參數的BOOST_PP_ITERATION
#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
之前應用一些預處理。
這個問題在我的措辭中非常具體,但是我希望這些概念足夠普遍,因爲它在這裏是可以接受的。
你應該看看[Boost.Preprocessor](http://www.boost.org/doc/libs/1_52_0/libs/preprocessor/doc/index.html)文檔 – TemplateRex