Ответ 1
Пока вы можете указывать указатели функций на другие указатели на функции и обратно, вызов функции с помощью указателя, который не соответствует его сигнатуре, - это поведение undefined. Вы не можете просто передать его и перейти к API.
В C и С++ 03 вам нужно создать именованную функцию-обертку, которая соответствует сигнатуре и преформирует трансляцию. В С++ 11 и более поздних версиях вместо этого вы можете просто использовать вместо лямбда без захвата (правильно отбросить):
void fun(SomeType* p){
...
}
int main() {
api_call(+[](void *v) {
fun(static_cast<SomeType*>(v));
});
}
+
перед лямбдой заставляет его преобразовываться в обычный указатель функции, пока он не захватывает. Это не строго необходимо, но делает намерение более явным ИМО без лишних слов.