안녕하세요, 누구든지이 문제를 도와 줄 수 있는지 궁금합니다. CallFunction (주석이있는 비트)을 구현하려고합니다. 나는 그것을하는 방법에 대해 가야할지 모르겠다.데이터 튜플 생성 및 함수 arguements로 압축을 풀어 보내기
[질문] 생성 된 유형의 튜플을 만들고 싶습니다. 인수가 있지만 한정자, const, & 등을 제거하여 데이터로 채울 수 있습니다. 함수로 넘어 간다.
지금은 반환 유형으로 귀찮게하지 않습니다. 누구든지 올바른 방향으로 나를 가리키거나 비슷한 것을했을 수 있습니까? 아니면 완전히 미친 짓이 아닌 할 수있는 일입니다. HMM! 어쨌든 TY이 :) 그것을 확인하기위한
template <typename This, typename Func> class ForwardFunction
{
private:
template <typename Object, typename Return, typename ...Arguments> struct info_base
{
enum { nargs = sizeof...(Arguments) };
typedef Return return_type;
typedef std::tuple<Arguments...> arg_list_type;
template <size_t index> struct arg
{
typedef typename std::tuple_element<index, std::tuple<Arguments...>>::type type;
};
template <int argCount> static void CallFunction(Func function, CLuaHelper & helper, lua_State *pState)
{
/*
// temp - pseudo
arg_list_type argList;
for (int i = 0; i < argCount; ++i)
std::get<0>(argList) = helper.Get<arg<i>::type>(pState);
(This::GetThis(pState)->*(function))(argList...);
*/
}
template <> static void CallFunction<0>(Func function, CLuaHelper & helper, lua_State *pState)
{
(This::GetThis(pState)->*(function))();
}
static void Call(Func function, CLuaHelper & helper, lua_State *pState)
{
CallFunction<nargs>(function, helper, pState);
}
};
template <typename Func> struct info;
template <typename Object, typename Return, typename ...Arguments> struct info<std::function<Return (Object::*)(Arguments...)>> : info_base<Object, Return, Arguments...> { };
template <typename Object, typename Return, typename ...Arguments> struct info<std::function<Return (Object::*)(Arguments...) const>> : info_base<Object, Return, Arguments...> { };
public:
static int ForwardCall(Func function, lua_State *pState)
{
CLuaHelper helper(pState);
info<std::function<Func>>::Call(function, helper, pState);
return helper.ReturnValues();
}
};
자사가
#define __LUA_FUNCTION_CALL [&](lua_State *pState) -> int
#define __LUA_INSTANT_ACCESS_CALL(name) \
{ #name, __LUA_FUNCTION_CALL { return ForwardFunction<CComponentScript, decltype(&CComponent::##name)>::ForwardCall(&CComponent::##name, pState); } }
const CLuaHelper::function_list CComponentScript::m_sRegisterFunctions[] =
{
__LUA_INSTANT_ACCESS_CALL(SetOnLoad),
__LUA_INSTANT_ACCESS_CALL(SetOnEvent),
__LUA_INSTANT_ACCESS_CALL(SetOnUpdate),
__LUA_INSTANT_ACCESS_CALL(SetOnClose),
__LUA_INSTANT_ACCESS_CALL(RegisterEvent),
__LUA_INSTANT_ACCESS_CALL(SetBasePriority),
{nullptr, nullptr}
};
@ 피봇 : 예, 당신이 옳다고 생각합니다 (코드를 업데이트 할 것입니다). –