Допустим, я пишу черту и хочу предоставить готовые специализации для всех стандартных контейнеров библиотеки.
template <class T>
struct supports_fast_insertion: std::false_type {};
template <class T, class A>
struct supports_fast_insertion<std::list<T, A>>: std::true_type {};
template <class T, class A>
struct supports_fast_insertion<std::forward_list<T, A>>: std::true_type {};
template <class T, class A>
struct supports_fast_insertion<std::unordered_set<T, A>>: std::true_type {};
// ...
Для этого требуется #include <list>
, #include <forward_list>
, #include <unordered_set>
и т. Д. Это означает, что любой файл, включающий мою черту типа, будет также включать половину библиотеки контейнеров, что выглядит небрежно.
Если бы я специализировался только на пользовательских типах, я мог бы просто объявить все, что мне небезразлично. Но добавление объявлений в namespace std
& ndash; даже простые предварительные заявления & ndash; вызывает неопределенное поведение .
Есть ли способ избежать взрыва #include
? Есть ли обычный способ для библиотек справиться с этим?