가정하자 나는 다음과 같은 정보가 일부 반사 메타 데이터를 가지고 : 함수 이름이 부여호출 C++ (회원) 함수를 동적으로
enum class type { t_int, t_double, t_str /* etc... */ };
struct meta_data
{
void* function;
void* instance;
std::vector<type> param_types;
};
std::map<std::string, meta_data> ftable;
내가이 맵에 함수를 호출하고 싶습니다를하고, 매개 변수를 모두 같은 문자열. 내 문제는 매개 변수를 변환하는 것이 아니라 (예 : boost::lexical_cast
) 올바른 유형의 함수 포인터로 캐스팅하고 함수를 호출하는 것입니다. 가능한 8 가지 유형과 최대 8 개의 매개 변수를 허용하면 이미 내 코드에 많은 분기가 있습니다. 내가 피하고 싶지 않은 것 (의사 코드) :
switch (md.param_types.size()) { case 0: cast function pointer, call it break; case 1: switch (md.param_types[0]) { case t_int: int param = boost::lexical_cast(param_strings[0]); cast function pointer, call with param case ... } break; case 2: switch (md.param_types[0]) { case t_int: int param = boost::lexical_cast(param_strings[0]); switch (md.param_types[1]) {...} // second param type.. } break; case n... }
매개 변수와 가능한 유형 수가 매우 빠르게 폭발합니다. 내가 (의사 코드)의 라인을 따라 몇 가지 해결책을 찾고 있는데 :
for (auto& p : paramter_strings)
{
convert p to a variable of matching type (type id comes from meta_data).
store value
}
call function with stored values
즉 함수 호출을위한 분기가 없다. 최소한의 상용구 코드로 (임의의 수의 매개 변수를 지원할 수 있음) 어떻게하면됩니까? 이것을 사용자 지정 스크립트 언어에 대한 바인딩을 만드는 것으로 생각할 수 있습니다.
메모를 (등 오버 플로우, 제로 포인터) 오류를 처리하지 않는 것을 알고있다. 또한 호출 규칙이 광범위하고 전달 된 매개 변수의 유형에 따라 달라 지므로 스택 개념은 일반적으로 작동하지 않습니다. 제 마음에 오는 유일한 것은 재귀적인 템플릿 호출이 하나씩 매개 변수를 추가 한 다음 마침내 "진짜"라고 부르는 것입니다. 그러나 전체적인 아이디어는 매우 미친 짓이다 ... – PlasmaHH
이 질문에'lua'라고 태그를 붙였다. Lua 스택인가 아키텍처 스택인가? 또한, 멤버 함수를 호출하는 경우'function'은 적어도'void (dummy :: * function)()'유형을 가져야하고 올바른 함수 유형을'reinterpret_cast '할 수 있습니다. – Simple
@Simple, 아니 루아 태그는 실수 였어. 내가 삭제했지만 재 태그를 잊어 버린이 PC에 관한 초안 질문이 있었다. 결정된. –