【发布时间】: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<T>的专业化,也许你可以检查一下。 -
我不完全同意重复。他们回答“为什么不”,但这里的问题是关于“那怎么办?”。答案虽然很好,但只是答案的一半
-
这回答了“那怎么办?”:stackoverflow.com/a/25292862/5470596
-
除了推导参数的困难(或不可能)之外:您的容器特征仅适用于具有默认分配器的容器。对于迭代器,为什么不直接使用 iterator_traits 而不是专门针对每个容器?
标签: c++