Идет коммерция? ;)
Вы можете создавать заголовочные файлы, в которых вы объявляете только открытый и защищенный API.
Пользователь представлен только с этими, которые они могут включать. Они связывают свой код с библиотекой, которую вы создали, используя полный API и определения.
Для встроенных функций: убедитесь, что они используются в не встроенном коде, тогда в библиотеке будет доступно определение (однако я не уверен, что оно будет встроено в пользовательскую реализацию).
Для шаблонного кода реального пути нет. Одно нерешительное решение - создать код, который использует шаблонный код с различными типами объектов. Пользователь будет ограничен этим, потому что это единственные определения, доступные в вашей библиотеке.