나는 콜백 함수로 사용되는 void f (void*, int);
함수를 가지고있다. 호출자는 void (*)(int)
을 예상합니다. std::bind1st
을 사용하여 서로 변환 할 수 있습니까? C++ 11 std::bind
, 그냥 std::bind1st
을 사용하지 않고 이것을 할 수있는 방법이 있습니까?void (*) (void *, int)를 void (*) (int)로 변환하는 데 std :: bind1st를 사용할 수 있습니까?
0
A
답변
2
호 std::bind1st()
비록 통화 운영자 취하고 int
와 함수 객체를 생성하고, 그것을 하지void(*)(int)
이다. 유일한 방법은,
static void* data = 0; // probably needs to be set to a more suitable value
void f_forward(int value) {
f(data, value);
}
누구라도 예를 들어 사용자 정의 된 컨텍스트를 가지고 있지 않은 콜백을 제공하는, 예를 들면, void(*)(int)
로 void(*)(void*, int)
글로벌 리소스 중 void*
를 획득 전달 함수를 갖는 것이다 우회전 방금 통과 한 C와 같은 인터페이스 void*
에서 인터페이스에 대해 너무 열심히 생각하지 않았습니다.
실제로. 글로벌/정적 변수를 피하기를 바랬습니다. 답변 해주셔서 감사합니다. –
@violetgiraffe 다른 방법은 자체 수정 코드를 작성하는 것입니다.이 코드는 C++보다 이식성이 낮고 하위 수준입니다. 기본적으로 OS에서 쓰기 가능한 페이지를 가져오고, 알려진 함수를 기계 코드에 내장 된 상수로 blit하고, 상수를 수정하고, 페이지를 읽기 전용 및 실행 가능으로 표시 한 다음 '하드 코드 된' void *'. 그리고 네, 이것은 많은 플랫폼에서 가능 합니다만, 그것은 거의보기가 현명하지 않습니다. 전역 변수를 사용하고 둘 이상이 필요하면'N'과 전역 배열 집합을 사용하고'N' 이상을 사용하지 않는다고 주장하십시오. – Yakk