如何在单个模板调用中传递const_iterator和非const迭代器

时间:2018-08-02 14:06:22

标签: c++ templates

我想知道如何将const_iterator传递给模板。例如,在下面的调用和函数模板中。

first1和last1的迭代器是

std::vector<std::pair<cv::Point_<float>, cv::Point_<float> > >::const_iterator

template < typename T>
T my_function(T __first1, T __last1, T __first2, T __last2, T __result)
{

}

并且first2和last2的迭代器是const_iterator

my_function(co1.begin(), co1.end(), co2.begin(), co2,end(), result.begin());

电话是

error: no matching function for call to ‘my_function(std::vector<std::pair<cv::Point_<float>, cv::Point_<float> > >::iterator, std::vector<std::pair<cv::Point_<float>, cv::Point_<float> > >::iterator, std::vector<std::pair<cv::Point_<float>, cv::Point_<float> > >::const_iterator, std::vector<std::pair<cv::Point_<float>, cv::Point_<float> > >::const_iterator, std::vector<std::pair<cv::Point_<float>, cv::Point_<float> > >::iterator)’’
             my_function(co1.begin(), co1.end(), co2.begin(), co2.end(), result.begin());

是否可以在单个模板中同时传递普通迭代器和const_iterator?

错误是

{{1}}

2 个答案:

答案 0 :(得分:5)

很显然,您需要不同的类型,以便推论成功,而不仅仅是T

template <typename T1, typename T2>
T1 my_function(T1 __first1, T1 __last1, T2 __first2, T2 __last2, T1 __result) { ... }

您可以添加SFINAE支票(高级!)(无论您要使用哪种方式):

std::enable_if_t<std::is_convertible_v<T2, T1>> // C++17 way

保留T2仅为T1 const 版本的限制。您可能要为_result和返回类型添加一个单独的类型。

答案 1 :(得分:4)

无需尝试将一种迭代器类型转换为另一种迭代器类型,只需添加另一种模板类型,该模板类型将允许两个范围具有两种不同类型的迭代器。

template < typename T, typename U, typename O>
T my_function(T __first1, T __last1, U __first2, U __last2, O __result)
{

}

还为输出类型添加了第三种类型

这使功能更加通用和灵活。