Может ли шаблон быть специализированным для стандартного библиотечного класса без включения заголовка этого класса? - PullRequest
0 голосов
/ 24 марта 2019

Допустим, я пишу черту и хочу предоставить готовые специализации для всех стандартных контейнеров библиотеки.

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? Есть ли обычный способ для библиотек справиться с этим?

1 Ответ

3 голосов
/ 24 марта 2019

Есть ли способ избежать взрыва #include?Есть ли для библиотек обычный способ справиться с этим?

К сожалению, на момент написания этой статьи не было удовлетворительного ответа.Если вы хотите избежать неопределенного поведения любой ценой, вам нужно укусить маркер и включить эти заголовки.

Если вы знаете свои предполагаемые реализации и не обращаете внимания на тот факт, что это формально нестандартно, выможет создать внутренний заголовок (для вашей библиотеки), который выполняет пересылку при проверке компилятора zillion и определенных макросов библиотеки.Boost является примером библиотеки, которая делает это, см. boost/detail/container_fwd.hpp.

...