단어로 표현하기가 어렵 기 때문에 여기에 예제가 있습니다.
int (*foo)(int) = load_sym<decltype(foo)>("foo");
template <typename T>
T load_sym(char *sym) {
/* some other stuff */
return (T)dlsym(sym);
}
가능하다면 decltype(foo)
간결하게 만들기 위해 부분을 생략하고 싶습니다 . 문제는 T
명시 적으로 템플릿 인수로 지정하지 않고도 결정할 수 있다는 것입니다 .
아마도 불가능할 것 같다는 느낌이 들지만, 사람들이 해결 방법을 생각해 냈는지 궁금합니다.
다음 auto
은 비 정적 데이터 멤버의 경우 를 피하고 작동하지만 약간 못생긴 솔루션입니다 .
struct Symbol {
Symbol(void* p) : p(p) {}
template <typename T>
operator T*() { return reinterpret_cast<T*>(p); }
void* p;
};
Symbol load_sym(const char *sym) {
/* some other stuff */
return dlsym(sym);
}
이제 할 수 있습니다
int (*foo)(int) = load_sym("foo");
이 Symbol
클래스는 단순히의 반환 값을 저장 load_sym
하지만 void*
을 모든 유형의 포인터 로 변환하는 데 사용할 수있는 변환 연산자 템플릿을 제공합니다 .
( void*
함수 포인터 유형으로의 변환 은 조건부로 지원되지만 POSIX가 필요하다고 생각합니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다