Реализация обратного вызова (для библиотеки C) как чисто виртуального в абстрактном классе C ++

Я столкнулся с проблемой при использовании библиотеки аудио C(PortAudio построен с ASIO SDK, но на самом деле это не имеет отношения к этому вопросу; технические детали только помешали бы мне задать вопрос).

Проще говоря, определенная функция C из этой библиотеки требует, чтобы я дал ей функцию обратного вызова, которая возвращает определенное значение и принимает определенные параметры; для ясности, скажем, обратный вызов должен выглядеть следующим образом:

int callback(int arg)

и вызов библиотечной функции выглядит так:

theCLibraryFuntion(foo, bar, callback);

Использование библиотеки, подобной этой (то есть процедурным способом в стиле C), работает нормально, но я хотел бы обернуть функциональные возможности библиотеки, которые важны для меня, в хорошо структурированные классы C ++. Проект, для которого мне нужна библиотека, - самый большой проект, над которым я до сих пор работал, поэтому OO-дизайн является для меня необходимостью.Я хочу создать абстрактный класс в C ++, который предоставляет чистую виртуальную функцию для реализации производных классов, а затем использовать эту реализацию для обратного вызова классом, который знает о библиотеке. Другими словами, мне нужен реальный полиморфизм, а не неприятный указатель на функцию-указатель.

Я не был в состоянии написать такие классы до сих пор. Компилятор не позволит мне передавать нестатические функции-члены любого класса в качестве обратного вызова для функции библиотеки C. Я понимаю, почему, но я хотел бы знать о некотором обходном пути для этого. Пока этот обходной путь, если он существует, дает мне полиморфное поведение для интерфейсных классов, мне все равно, насколько злым становится внутренний код. Если такого обходного пути не существует, пусть будет так. Я хорошо понимаю, как работает C в фоновом режиме, но я мало знаю о технических особенностях OO-функций в C ++, поэтому я собираюсь предположить, что есть способ.

Заранее спасибо!

Примечание: обходной путь, который может привести к значительным накладным расходам, скорее всего, будет бесполезным для меня. Я вынужден использовать эту библиотеку C portaudio, потому что это единственный API, который дает мне крайне низкую задержку для потоковой передачи звука, которая требуется моему проекту, поэтому резкое увеличение накладных расходов на самом деле не вариант.

Ответы на вопрос(2)

Ваш ответ на вопрос