我想知道如何将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)
显然,你需要不同的类型,以便扣除成功,而不仅仅是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和返回类型.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |