오히려 못생긴 템플릿 코딩을 다시 코딩하려고합니다. 참고로템플릿으로 인스턴스 메소드 trampoline 함수 코딩하기
원래는 여기 : CPython의 (C 라이브러리)와 https://codereview.stackexchange.com/questions/69545/recode-c-c-trampoline-function-macros-using-templates
class Final : Base
{
void Foo(){...}
void Bar(){...}
static void init(){
// register_method populates a table of "extern C" function pointers.
register_method("foo", & FooHandler);
register_method("bar", & BarHandler);
}
:
// trampolines
static void FooHandler(void* pInstance) {
Final* f = reinterpret_cast<Final*>(pInstance);
f->Foo();
}
static void BarHandler(void* pInstance) {
Final* f = reinterpret_cast<Final*>(pInstance);
f->Bar();
}
}
내 코드 인터페이스. 파이썬 런타임 "myInst.foo"을보고, 표에 "foo는"조회하고 호출 :
이Final::FooHandler(pointer_to_myInst);
에
FooHandler의 트램폴린을 (C의 함수 포인터에 고정 방법을 타입 변환 할 수 있습니다) Final의 정확한 인스턴스의 Foo 메소드.
실제로 핸들은 깨끗하지는 않으며 동일한 핸들러가 필요하지만 각각 고유 한 기능 주소가있는 많은 메소드가 있습니다. 나는 기본 클래스에 추상 핸들러 메커니즘을 시도하고
이 같은 뭔가 :
class Final : Base<Final>
{
void Foo(){...}
void Bar(){...}
static void init(){
// register_method populates a table of "extern C" function pointers.
register_method("foo", & Foo, Handler< &Foo>);
register_method("bar", & Bar, Handler< &Bar>);
}
:
}
class Base<Final>
{
typedef void (Final::*FuncSig)(void);
typedef void (Final::*HandlerSig)(void*); // takes 1 pvoid param
void register_method(std::string name, FuncSig meth, HandlerSig handler) {
...
}
// generic trampoline
template< Sig sig>
static void Handler(void* pInstance) {
Final* f = reinterpret_cast<Final*>(pInstance);
f ->* sig();
}
}
나는 현재 컴파일러 오류 (http://ideone.com/vOtbcD를) 갇히지, 그래서 나는 여부도 확실하지 않다 기술이 유효합니다.
이 작업을 수행 할 수있는 방법이 있습니까? 아니면 실제로 매크로가 필요한 시간일까요? 참고로
원래는 여기에 있습니다 : https://codereview.stackexchange.com/questions/69545/recode-c-c-trampoline-function-macros-using-templates는
에서 볼 수있는 바와 같이
원래 오히려 추한 매크로를 사용합니다.
: 당신은 함수 포인터에 대해 별도의 변수를 선언하거나, 내가에서 검토이 코드까지 넣어 가지고 더러운 캐스트 (또는 부스트 :: implicit_cast 같은 멋진 캐스트)
를 사용하여 중 하나를 해결할 수 있습니다 기본 클래스'Template'는 템플릿 클래스가 아니기 때문에'template' 키워드가 필요합니다. ['std :: function'] (http : //en.cppreference.co.kr/w/cpp/utility/functional/function) 및 ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind)를 참조하십시오. –