模板是否可以专门用于标准库类而不包含该类的标头?

Can a template be specialized for a standard library class without including that class's header?

本文关键字:包含该 标准 是否 用于      更新时间:2023-10-16

假设我正在编写一个特征,我想为所有标准库容器提供开箱即用的专用化。

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添加声明(即使只是前向声明(也会调用未定义的行为。

有没有办法避免#include爆炸? 图书馆有没有传统的方法来处理这个问题?

有没有办法避免 #include 爆炸?图书馆有没有传统的方法来处理这个问题?

可悲的是,截至撰写本文时,还没有令人满意的答案。如果您希望不惜一切代价避免未定义的行为,那么您必须咬紧牙关并包含这些标头。

如果你知道你的预期实现,并且不介意它在形式上是非标准的,你可以创建一个内部标头(到你的库(,在无数编译器和库特定的宏检查下进行转发。Boost 是执行此操作的库的一个示例,请参阅boost/detail/container_fwd.hpp