내 프로젝트 중 하나에 luabind
을 포함시키고 싶습니다. 그렇게하려면 call_function
(아래 참조)과 비슷한 동작을 제공해야합니다. 이 함수는 몇 가지 템플릿 마법을 사용합니다 (Boost의 호의). 템플릿 메타 프로그래밍을 처음 접한 것은 이번이 처음입니다. 그래서 저는 조금 잃었습니다. 다음은 도움을 주시면 감사하겠습니다.가변 길이 인수 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
을 호출하기 전에 일부 사전 처리를 적용 할 수도 있습니다.
이 질문은 제가 말한 방식으로 매우 구체적입니다. 그러나이 개념은 여기에서 OK 일 정도로 충분히 일반적이라고 생각합니다.
[Boost.Preprocessor] (http://www.boost.org/doc/libs/1_52_0/libs/preprocessor/doc/index.html) 설명서를 참조하십시오. – TemplateRex