Этого нельзя сделать с typedef
. Пользователь MyTypeSet
должен иметь возможность видеть полные определения для MyType
, MyTypeHash
и MyTypeKeyEqual
, чтобы знать, как скомпилировать MyTypeSet
.
Существует несколько подходов, используемых для разграничения открытого интерфейса шаблонного кода от деталей реализации:
- Поместите детали реализации в другой заголовок («MyTypeImpl.hpp»), который включен в публичный заголовок.
- Поместите частные типы реализации в пространство имен с именами
detail
, private
или аналогичное.
- Менять частные имена символами подчеркивания, как в
MyTypeHash_
. (Это хорошо видно в стандартной библиотеке MSVC).
Если абсолютно необходимо хранить MyTypeHash
и MyTypeKeyEqual
в секрете, тогда можно объявить MyTypeSet
как класс, который имеет только методы, необходимые конечному пользователю. Тогда MyTypeSet
может использовать идиому pImpl , чтобы иметь std::unordered_set
в качестве переменной-члена, видимой только в исходном файле. Все методы MyTypeSet
будут реализованы путем вызова std::unordered_set
.
Такой MyTypeSet
не может иметь точно такой же открытый интерфейс, как std::unordered_set
, потому что std::unordered_set
предоставляет свои типы хешей и ключей в качестве типов элементов.