为什么 make_reverse_iterator(make_reverse_iterator(it)) 导致不同的类型?
Is there a reason why make_reverse_iterator(make_reverse_iterator(it)) results in a different type?
我认为:
static_assert(is_same_v<
decltype(make_reverse_iterator(make_reverse_iterator(it)))
, decltype(it)>);
会编译,但不会。这有什么原因吗?我认为这可能会导致在编写模板时生成更大的代码。
这并不难实现:
template <typename T>
T make_reverse_iterator(reverse_iterator<T> it) {
return it.base();
}
如果在调用模板函数时进行两次或更多次反转,将导致更小的二进制文件,特别是如果该函数要说使用它所调用的 reverse_iterator 递归地调用自身而不复杂化具有其他专业的代码。
有一个简单的问题,其答案解释了这一点:
make_reverse_iterator
的 return 值是 reverse_iterator
吗?
看,反向迭代器不仅仅是一个向后运行的迭代器。是一种类型。或者更确切地说,它是一个生成一系列类型的模板。并且该模板有望提供某些行为;该行为使其成为反向迭代器。
这是非 reverse_iterator
类型不需要提供的行为。 reverse_iterator<reverse_iterator<I>>
与 I
不同。例如,您无法获取 I
的 base
。
如果用户调用 make_reverse_iterator
,他们有权期望获得 reverse_iterator
,并拥有该模板提供的所有权力和特权。对 return 来说,其他任何事情都等同于对用户撒谎。
您似乎想要的是 make_iterator_go_backwards
:一个 return 某种迭代器类型的函数,该迭代器类型向后遍历序列。这是一件值得期待的事情。
但是那个东西不是拼写的make_reverse_iterator
。如果您有一个名为 make_some_type
的函数,它应该 return some_type
.
我认为:
static_assert(is_same_v<
decltype(make_reverse_iterator(make_reverse_iterator(it)))
, decltype(it)>);
会编译,但不会。这有什么原因吗?我认为这可能会导致在编写模板时生成更大的代码。
这并不难实现:
template <typename T>
T make_reverse_iterator(reverse_iterator<T> it) {
return it.base();
}
如果在调用模板函数时进行两次或更多次反转,将导致更小的二进制文件,特别是如果该函数要说使用它所调用的 reverse_iterator 递归地调用自身而不复杂化具有其他专业的代码。
有一个简单的问题,其答案解释了这一点:
make_reverse_iterator
的 return 值是 reverse_iterator
吗?
看,反向迭代器不仅仅是一个向后运行的迭代器。是一种类型。或者更确切地说,它是一个生成一系列类型的模板。并且该模板有望提供某些行为;该行为使其成为反向迭代器。
这是非 reverse_iterator
类型不需要提供的行为。 reverse_iterator<reverse_iterator<I>>
与 I
不同。例如,您无法获取 I
的 base
。
如果用户调用 make_reverse_iterator
,他们有权期望获得 reverse_iterator
,并拥有该模板提供的所有权力和特权。对 return 来说,其他任何事情都等同于对用户撒谎。
您似乎想要的是 make_iterator_go_backwards
:一个 return 某种迭代器类型的函数,该迭代器类型向后遍历序列。这是一件值得期待的事情。
但是那个东西不是拼写的make_reverse_iterator
。如果您有一个名为 make_some_type
的函数,它应该 return some_type
.