模板是否可以专门用于标准库类而不包含该类的标头?
Can a template be specialized for a standard library class without including that class's header?
假设我正在编写一个特征,我想为所有标准库容器提供开箱即用的专用化。
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
。
相关文章:
- 该标准是否说明了例外和不同调用约定的共存
- 如何在文件中搜索字符串并打印包含该字符串的行
- 线程在销毁包含该线程的对象时调用 thread.detach()
- 如果我在不同的类中包含基类,是否也会包含该基类的派生类
- 使用包含该结构内部结构的 using 定义
- 如何将模板化服务传递到类中,而不在该类标头中包含该服务的头文件?
- 为什么该标准同时提供is_integer和is_exact
- 将变量传递给函数返回包含该变量的新值重复直到值达到 0
- C++,我想在字符串中搜索一个字符,并输出包含该字符的所有单词
- 将NetBeans配置为调试包含非标准库的C 程序
- 将Boost库包含到标准MinGW路径中
- c++如何在特定文件中包含所有函数而不包含该文件
- 在结构中,文件名可以包含非标准字符
- 如何同时包含所有C++标准库
- 该标准是否提供了有关从基本类型迁移的任何保证
- 在定义可见性方面,该标准对undreded_set的Value类型提出了哪些要求
- 什么时候将范围包含在c++标准中?
- 从std::vector存储到std::set,其中vector包含一个结构体,而std::set只包含该结构体中的一个
- 为什么不始终包含所有标准标头
- 英特尔® IPP 异步 C/C++ 库是否包含在标准 IPP 库中?