Implementando retorno de chamada (para biblioteca C) como virtual puro na classe abstrata C ++

Encontrei um problema ao usar uma biblioteca de áudio C(O PortAudio foi construído com o ASIO SDK, mas isso não é realmente relevante para esta questão; os detalhes técnicos apenas me impediriam de fazer a pergunta).

Simplificando, uma determinada função C dessa biblioteca exige que eu a execute uma função de retorno de chamada que retorne um certo valor e aceite determinados parâmetros; por uma questão de clareza, digamos que o retorno de chamada deve ser assim:

int callback(int arg)

e a chamada para a função de biblioteca fica assim:

theCLibraryFuntion(foo, bar, callback);

Usar a biblioteca como esta (ou seja, da maneira processual em estilo C) funciona bem, mas eu gostaria de agrupar as funcionalidades da biblioteca que são relevantes para mim em classes C ++ bem estruturadas. O projeto para o qual eu preciso da biblioteca é o maior em que trabalhei até agora, portanto o design de OO é uma obrigação para mim.Desejo criar uma classe abstrata em C ++ que forneça uma função virtual pura para a implementação de classes derivadas e, em seguida, faça com que essa implementação seja usada para o retorno de chamada por uma classe que conheça a biblioteca. Em outras palavras, eu preciso de um polimorfismo real, em vez de um desastre de ponteiro de função.

Não pude escrever essas aulas até agora. O compilador não permitirá que eu passe funções membro não estáticas de qualquer classe como retorno de chamada para a função da biblioteca C. Entendo o porquê, mas gostaria de saber sobre algumas soluções alternativas para isso. Enquanto essa solução alternativa, se existir, me fornecer um comportamento polimórfico para as classes de front-end, não me importo com a gravidade do código de back-end. Se não existe essa solução alternativa, que assim seja. Eu entendo muito bem como o C funciona em segundo plano, mas sei pouco sobre os detalhes técnicos dos recursos de OO no C ++, então vou assumir que existe uma maneira.

Desde já, obrigado!

Nota: uma solução alternativa que adicionaria uma sobrecarga considerável provavelmente será inútil para mim. Sou forçado a usar esta biblioteca de C portaudio porque é a única API que me fornece a latência extremamente baixa para streaming de áudio que meu projeto exige, portanto, aumentar drasticamente a sobrecarga não é realmente uma opção.

questionAnswers(2)

yourAnswerToTheQuestion