我正在编写一个partition函数,它是BidirectionalForward迭代器的特化。

而且我不确定顺序是否会影响结果,即这两个版本是否不同。

第一

template< class BIter, class UnaryPredicate>
BIter __partition( BIter first,
                   BIter last,
                   UnaryPredicate pred,
                   std::bidirectional_iterator_tag);

template<typename FIter, typename UnaryPredicate>
FIter __partition(FIter first,
                  FIter last,
                  UnaryPredicate pred,
                  std::forward_iterator_tag);

template<typename FIter, typename UnaryPredicate>
FIter newton::partition(FIter first,
                        FIter last,
                        UnaryPredicate pred)
{
  return newton::__partition(first, last, pred, std::__iterator_category(first));
}


第二名

template<typename FIter, typename UnaryPredicate> FIter
__partition(FIter first,
            FIter last,
            UnaryPredicate pred,
            std::forward_iterator_tag);

template< class BIter, class UnaryPredicate>
BIter __partition(BIter first,
                  BIter last,
                  UnaryPredicate pred,
                  std::bidirectional_iterator_tag);

template<typename FIter, typename UnaryPredicate>
FIter newton::partition(FIter first,
                        FIter last,
                        UnaryPredicate pred)
{
  return newton::__partition(first, last, pred, std::__iterator_category(first));
}


我看到gcc,llmv等使用第二个版本,但是...我读到编译器使用了原型适合的第一个函数。

并且Bidirectional Iter是否适合Forward Iter然后使用该功能而不是专用功能不是这种情况吗?

最佳答案

不,顺序无关紧要。

如果category参数恰好是std::bidirectional_iterator_tag,则一个函数比需要转换为基类的函数更好。

07-26 09:37
查看更多