【问题标题】:Boost traits to check if an object is STL container提升特征以检查对象是否为 STL 容器
【发布时间】:2014-08-21 07:05:43
【问题描述】:

我正在我的项目中重构一个序列化库,以便它与 -std=c++11 并想识别一个对象是否是 STL 容器,例如

is_stl_deque<T>::value
is_stl_list<T>::value 
is_stl_vector<T>::value
is_set<T>::value
is_map<T>::value
is_pair<T>::value
is_sequence<T>::value

是否有任何提升特征来检查对象是否是 STL 容器?

如果没有(我找不到),我该如何实现?

【问题讨论】:

  • 您可能解决了错误的问题。首先,“STL 容器”定义不明确,其次,您错过了一些标准库容器,第三,“类似 STL”的容器呢?例如 Qt 容器。
  • 你可以使用is_same,或者boost equivalent
  • 如果您已经在使用 Boost,为什么不使用 Boost serialization
  • @JoachimPileborg 事实上,我正在重构现有的序列化库,以便它使用 -std=c++11 进行编译,并且迁移到 Boost 序列化可能会破坏我现有数据的向后兼容性。
  • 好吧,如何创建一个 trait-class 来检查是否有为目标类定义的 beginend 方法?这将适用于所有标准容器,以及 Qt 容器,也可能来自其他库。它可以完成,并且已经完成(只需搜索一下,您就会在 SO 上找到此类问题的链接)。

标签: c++ boost stl typetraits


【解决方案1】:

我不知道 boost 中是否有任何东西,但是您列表中的东西很容易通过部分专业化来实现:

template<class T>
struct is_vector : std::false_type { };

template<class T, class Alloc>
struct is_vector<std::vector<T, Alloc>> : std::true_type { };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多