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

inf*_*ged 1 c++ templates

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

first1和last1的迭代器是

std::vector<std::pair<cv::Point_<float>, cv::Point_<float> > >::iterator
Run Code Online (Sandbox Code Playgroud)

而first2和last2的迭代器是const_iterator

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)
{

}
Run Code Online (Sandbox Code Playgroud)

打电话是

my_function(co1.begin(), co1.end(), co2.begin(), co2,end(), result.begin());
Run Code Online (Sandbox Code Playgroud)

有没有办法在单个模板中传递普通迭代器和const_iterator?

错误是

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());
Run Code Online (Sandbox Code Playgroud)

Log*_*uff 5

显然,你需要不同的类型,以便扣除成功,而不仅仅是T:

template <typename T1, typename T2>
T1 my_function(T1 __first1, T1 __last1, T2 __first2, T2 __last2, T1 __result) { ... }
Run Code Online (Sandbox Code Playgroud)

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

std::enable_if_t<std::is_convertible_v<T2, T1>> // C++17 way
Run Code Online (Sandbox Code Playgroud)

保留T2只是const版本的限制T1.您可能还想为其添加单独的类型_result和返回类型.