我会认为:
static_assert(is_same_v<
decltype(make_reverse_iterator(make_reverse_iterator(it)))
, decltype(it)>);
Run Code Online (Sandbox Code Playgroud)
会编译,但没有。这是有什么原因吗?我认为这可能会导致在编写模板时生成更大的代码。
这并不难实现:
template <typename T>
T make_reverse_iterator(reverse_iterator<T> it) {
return it.base();
}
Run Code Online (Sandbox Code Playgroud)
如果在调用模板函数时进行两次或多次反转,则将导致较小的二进制文件,特别是如果该函数使用其调用内容的反向迭代器递归地调用自身,而不会使代码与其他专业化变得复杂。
有一个简单的问题,其答案解释了这一点:
返回值是make_reverse_iteratora吗reverse_iterator?
看,反向迭代器不仅仅是向后运行的迭代器。这是一种类型。或者更确切地说,它是一个生成一系列类型的模板。该模板预计会提供某些行为;这种行为使其成为反向迭代器。
这是非类型不需要提供的行为reverse_iterator。Areverse_iterator<reverse_iterator<I>>与 不是同一件事I。例如,您无法获得baseof 。I
如果用户调用make_reverse_iterator,他们有权期望获得reverse_iterator,并具有该模板提供的所有权力和特权。返回任何其他内容就等于对用户撒谎。
您似乎想要的是make_iterator_go_backwards:一个返回某种迭代器类型的函数,该迭代器类型可以向后遍历序列。这是一个合理的愿望。
但那个东西没有拼写make_reverse_iterator。如果您有一个名为 的函数,make_some_type它应该返回some_type。
| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |