Не думаю, что это возможно, поскольку синтаксис и семантика библиотеки могут быть в некоторой степени уникальными.
Конечно, вы можете создавать прокси для всех классов и предоставлять их, но это может потребовать некоторой работы (написание каркаса, сканирующего библиотеку), и это не гарантирует, что обмен библиотекой будет легким.
Представьте, что замена будет предоставлять разные методы и даже использовать другую семантику (в некоторой степени). Что, если при замене отсутствовали методы / поля и т. Д.
Лучший способ справиться с этим - написать явную оболочку и заставить пользователей использовать только эту оболочку. Таким образом, вы можете ограничить API основными концепциями, которые действительно необходимы. Тем не менее, это может не обеспечить достаточно хорошую инкапсуляцию, основываясь на том, что на самом деле делает библиотека.
Пример :
Для 3D-программирования вы можете использовать OpenGL или Direct3D. Оба имеют несколько разные API, но используют одни и те же основные понятия. Таким образом, вы можете создать оболочку для них, которая предоставляет унифицированный API. Эта обертка может затем преобразовать некоторые данные и т. Д. (Например, сделать ориентированные на столбцы матрицы ориентированными на строки и наоборот), но поскольку основные концепции одинаковы, это должно быть выполнимо.
Однако вам необходимо придерживаться основных концепций и не использовать дополнительные функции. Например, Direct3D также предоставит еще более высокий уровень API (Direct3DX), который не предоставляется OpenGL.