기본적으로 형식을 수동으로 지정하지 않고도 제네릭 C 함수에 대한 래퍼를 생성하려고합니다. 그래서 고정 된 프로토 타입으로 콜백을 가지고 있지만 래퍼 함수의 유형에 따라 래퍼에서 특별한 코드를 수행해야 할 것입니다. 그래서 기본적으로 클래스 템플릿에서 정적 메서드를 사용하려고합니다.유형이 아닌 템플릿 매개 변수 ... 템플릿입니다. (C++)
// this is what we want the wrapped function to look like
typedef void (*callback)(int);
void foobar(float x); // wrappee
// doesn't compile
template< T (*f)(S) > // non-type template param, it's a function ptr
struct Wrapper
{
static void wrapped(int x)
{
// do a bunch of other stuff here
f(static_cast<S>(x)); // call wrapped function, ignore result
}
}
를 그리고 내가 좋아하는 일을하고 싶습니다 : 규격에 부합하는 인터페이스 예를 들어 내 기능을 포장하는
AddCallback(Wrapper<foobar>::wrapped);
그러나, 문제는 내가 그냥 앞서 및 사용에 갈 수 있다는 것입니다 래퍼 템플릿의 함수 매개 변수에 "S"가 있으면 먼저 매개 변수로 나열해야합니다.
template< class T, class S, T (*f)(S) >
struct Wrapper
// ...
그러나이 말은()을 사용하는 것이 훨씬 더 고통 스럽다는 것을 의미합니다. 이상적으로는 함수 포인터를 전달하고 매개 변수의 유형 (및 반환 유형)을 자동으로 처리하고 싶습니다. 명확하게 말하면, 래핑 된 함수 내에서 함수 포인터의 유형을 참조해야 할 것입니다 (그래서 나는 S 또는 T와 동등한 것이 필요합니다).
이 방법이 있습니까?
@damndirtyape : 귀하의 질문에 대해 생각해 보았습니다. 비슷한 것을 시도한 것 같습니다. 불행히도 많은 코드가 필요했습니다. 기본적으로, 내 솔루션은 operator()를 오버로드 한 기본 클래스를 갖고 있으며 함수 유형을 기반으로 기본 클래스를 생성 한 팩토리 함수를 가졌습니다. 당신이 좋아한다면 나는 어딘가에 pastebin에 코드를 게시 할 수 있습니다. –