前向迭代器的重载
Overloading for forward iterators
在查看libc++时,我发现了当模板参数是前向迭代器时,有两种不同的重载函数的方法。
第一种方法是使用std::iterator_traits::iterator_category
template <class ForwardIter1, class ForwardIter2>
inline
bool
__some_function(ForwardIter1 first1, ForwardIter1 last1,
ForwardIter2 first2, ForwardIter2 last2,
std::forward_iterator_tag, std::forward_iterator_tag)
{
// do stuff ...
return true;
}
template <class InputIter1, class InputIter2>
inline
bool
__some_function(InputIter1 first1, InputIter1 last1,
InputIter2 first2, InputIter2 last2,
std::input_iterator_tag, std::input_iterator_tag)
{
// do stuff ...
return true;
}
template <class InputIter1, class InputIter2>
inline
bool
some_function(InputIter1 first1, InputIter1 last1,
InputIter2 first2, InputIter2 last2)
{
return __some_function(first1, last1, first2, last2,
typename std::iterator_traits<InputIter1>::iterator_category(),
typename std::iterator_traits<InputIter2>::iterator_category());
}
但我也看到了std::enable_if
的用途
template <class ForwardIter1, class ForwardIter2>
inline
bool
some_function(ForwardIter1 first1, ForwardIter1 last1,
ForwardIter2 first2, ForwardIter2 last2,
typename std::enable_if<
__is_forward_iterator<ForwardIter1>::value &&
__is_forward_iterator<ForwardIter2>::value
>::type* = 0)
{
// do stuff ...
return true;
}
template <class InputIter1, class InputIter2>
inline
bool
some_function(InputIter1 first1, InputIter1 last1,
InputIter2 first2, InputIter2 last2,
typename std::enable_if<
__is_exactly_input_iterator<InputIter1>::value &&
__is_exactly_input_iterator<InputIter2>::value
>::type* = 0)
{
// do stuff ...
return true;
}
这两者中的哪一种是解决问题的"首选"方法,还是取决于情况。在这种情况下,什么时候一种解决方案会比另一种更好?
更好的方法是使用 enable if
作为返回类型,这样就不需要将任何额外的参数(带有默认值(传递给函数:
template <class ForwardIter1, class ForwardIter2>
typename std::enable_if
<
__is_forward_iterator<ForwardIter1>::value
&&
__is_forward_iterator<ForwardIter2>::value
, bool
>::type
some_function
(
ForwardIter1 first1, ForwardIter1 last1
, ForwardIter2 first2, ForwardIter2 last2
)
{
// do stuff ...
return(true);
}
此外,还保留了带有双下划线的标识符,但让我们假设__is_forward_iterator
模板是有效的并且存在于某处。
相关文章:
- 迭代器类的重载前缀增量运算符会引发分段错误
- 了解运算符重载和迭代器,为什么它会打印出"wrhrwwr"?
- 迭代器和无符号整数的重载 + 运算符
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 如何实现容器的重载和模板函数的迭代器?
- 为什么标准容器迭代器不会重载"->*"?
- 前向迭代器的重载
- VC++11映射和多映射迭代器(重载)C2535
- 重载输出运算符<<以使用 STL 列表迭代器
- 迭代器 CPP,运算符重载
- 使用常量迭代器的运算符重载
- 向量迭代器在赋值重载中不兼容
- 迭代器 - vector::itrator 和 array::iterator 的重载函数
- 如何将重载增量运算符用于迭代器
- 运算符重载和迭代器混淆
- C++ 解释重载成员函数迭代器(int i = 0) 的构造"one liner":i(i) { };
- 重载迭代器类的增量运算符
- 模板和运算符重载以及迭代器
- 模板泛型树类的模板迭代器的c++操作符重载
- 重载迭代器:c++语义问题