gpt4 book ai didi

c++ - Microsoft 标准库中整数类型的 std::iterator_traits

转载 作者:行者123 更新时间:2023-11-30 04:21:04 24 4
gpt4 key购买 nike

我有一个模板函数,需要专用于迭代器。所以我所做的是:

template <typename T>
void function2(T whatever, typename std::iterator_traits<T>::pointer) // ... iterator

template <typename T>
void function2(T whatever, ...) // ... non-iterator

template <typename T>
void function(T whatever) {
function2(whatever, NULL);
}

我碰壁了,因为 Microsoft 标准库专攻 std::iterator_traits对于所有数字类型( boolcharintfloat …)。它这样做是为了 referencepointer是非 void , 尽管事实上 operator*也不operator->可以在这些类型上调用。

好的,我可以检查 std::iterator_traits<T>::category派生 std::input_iterator (实际上我认为 std::forward_iterator 更适合我的情况)以一些更复杂的模板机制为代价。

但是我有兴趣知道:

  • 他们为什么定义iterator_traits对于不符合迭代器概念的类型(即使输出迭代器至少需要一元 operator* ,这些类型都没有。
  • 他们这样做是否违反了 C++ 规范?并不是说 Microsoft 不会到处违反它,但如果他们违反了,我会对特定于编译器的解决方法感到满意,如果他们显然没有违反的话。
  • 总的来说它是否可行?出现 std::iterator_traits<T>::pointer始终存在,但未定义,这会导致错误而不是 SFINAE。

最佳答案

Other functions [res.on.functions]

[...]

2 In particular, the effects are undefined in the following cases:

  • for types used as template arguments when instantiating a template component, if the operations on the type do not implement the semantics of the applicable Requirements subclause

为了使用iterator_traits<T> , T必须是一个迭代器。如果不是,则行为未定义。您无法检测类型 T在编译时是一个迭代器。这甚至在理论上是不可能的,因为允许类型支持与迭代器相同的运算符和类型定义,因此实现的泛型 iterator_traits<T>可以在没有任何错误或警告消息的情况下被实例化,但具有完全不同的含义。

考虑一下,既然您的评论阐明了合理的猜测就足够了,我认为您最好还是使用 SFINAE 和 enable_if检测核心操作(一元 * 和前缀 ++ ),使用 std::iterator_traits<T>::pointer只有满足这些条件。

关于c++ - Microsoft 标准库中整数类型的 std::iterator_traits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14830112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com