【问题标题】:Partial specialization fails for container iterators [duplicate]容器迭代器的部分特化失败[重复]
【发布时间】:2019-08-30 13:07:30
【问题描述】:

我想为不同的容器迭代器实现部分特化。如果我对容器这样做,代码编译得很好,但对于它们的迭代器却失败了:

template<typename T>
struct IsContainer : std::false_type {};
template<typename T>
struct IsContainer<std::list<T>> : std::true_type {};
template<typename T>
struct IsContainer<std::set<T>> : std::true_type {};
template<typename T1, typename T2>
struct IsContainer<std::map<T1, T2>> : std::true_type {};

产生错误

类模板偏特化包含不能推导的模板参数;这个部分特化永远不会被使用

对于每个专业:

template<typename T>
struct IsIterator : std::false_type {};
template<typename T>
struct IsIterator<std::list<T>::iterator> : std::true_type {};
template<typename T>
struct IsIterator<std::set<T>::iterator> : std::true_type {};
template<typename T1, typename T2>
struct IsIterator<std::map<T1, T2>::iterator> : std::true_type {};

迭代器的正确形式是什么?

【问题讨论】:

  • 我认为一般来说确定某个东西是否是迭代器并不容易。如果有std::iterator_traits&lt;T&gt;的专业化,也许你可以检查一下。
  • 我不完全同意重复。他们回答“为什么不”,但这里的问题是关于“那怎么办?”。答案虽然很好,但只是答案的一半
  • 这回答了“那怎么办?”:stackoverflow.com/a/25292862/5470596
  • 除了推导参数的困难(或不可能)之外:您的容器特征仅适用于具有默认分配器的容器。对于迭代器,为什么不直接使用 iterator_traits 而不是专门针对每个容器?

标签: c++


【解决方案1】:

这里的编译器消息非常具有描述性。这就是编译器处理模板特化的方式。我将尝试从编译器的角度解释为什么这是不可能实现的。

当你有以下代码时:

template<typename T>
struct IsContainer : std::false_type {};
template<typename T>
struct IsContainer<std::list<T>> : std::true_type {};

当编译器需要实例化IsContainer&lt;SomeType&gt; 时,它需要检查SomeType 是否是带有一些模板参数的std::list,这是非常可行的。如果是 - 它使用部分专业化,如果不是 - 通用的。

让我们尝试对以下代码执行相同的操作:

template<typename T>
struct IsIterator : std::false_type {};
template<typename T>
struct IsIterator<typename std::list<T>::iterator> : std::true_type {};

如果编译器需要实例化IsContainer&lt;SomeType&gt;,则需要检查SomeType 是否是std::list&lt;T&gt;::iterator 用于某些类型T。由于list&lt;T&gt;::iteratorlist&lt;T&gt; 的一些独立类型(理论上),唯一的选择是这样做就是枚举所有可能的类型(包括无限多的模板实例化),这显然是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 2011-09-23
    • 2015-09-20
    • 2014-02-01
    • 2020-07-31
    • 2011-02-11
    • 2012-11-14
    • 2012-03-23
    相关资源
    最近更新 更多