【发布时间】:2012-12-25 17:48:07
【问题描述】:
我想将luabind 合并到我的一个项目中。为此,我需要提供一个行为类似于call_function 的函数(见下文)。这个函数使用了一些模板魔法(由 Boost 提供),我希望能得到一些帮助。这是我第一次真正遇到模板元编程(这就是所谓的吗?)所以我有点迷茫。以下是一些我希望能提供帮助的 sn-ps。
#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文档
标签: c++ templates boost template-meta-programming boost-preprocessor