【问题标题】:Is it possible to use type traits to check whether a type is a container?是否可以使用类型特征来检查类型是否是容器?
【发布时间】:2011-10-01 00:01:39
【问题描述】:

我可以使用 C++ Type Traits 来检查一个类型是否是类似 STL 的容器吗?我已经知道 GCC 的内置函数 __is_class,但如果可能的话,我想更具体一点。

【问题讨论】:

  • 定义“STL-like”的含义。
  • @JohnPS: 一个容器需要value_type, iterator, const_iterator, reference, const_reference, pointer, difference_type, size_type, @9876543 end()size()max_size()empty()swap(),并且必须满足其他一些简单的条件。
  • 该死,我猜std::forward_list 不是一个容器(它没有size())。我的观点:我目前不知道容器的普遍接受定义。
  • 也许您可以从 Boost Range Library 中完成的概念检查中学习 - 或者直接使用它们。

标签: c++ templates typetraits


【解决方案1】:

您可以构建自己的特征类来检查 Container 接口的类型。这将涉及验证某些关联类型(例如container::iterator)是否存在并验证某些表达式(例如container.empty())是否有效(即它们编译时没有错误)。各种 SFINAE 技术可用于构建检查嵌套类型和验证表达式的特征类。

SGI 的page 详细指定了容器“概念”模型必须提供的相关类型和有效表达式。最新的 ISO C++ 标准文档可能会提供更权威的来源,因为 SGI 页面已经很老了。

当然,traits 类不能验证 container.empty() 这样的表达式的语义;他们只能检查表达式是否合法。有些人有 proposed 扩展语言以允许程序员断言表达式的语义属性,这将解决这个限制。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
相关资源
最近更新 更多