gpt4 book ai didi

c++ - 减少重载函数的冗余代码(const& vs &)

转载 作者:行者123 更新时间:2023-11-30 04:16:01 24 4
gpt4 key购买 nike

template<typename T, typename TriFunc>
TriFunc process_three_continuous_channels_impl(cv::Mat &input, TriFunc func)
{
int const total = input.total();
auto *input_ptr = input.ptr<T>(0);
for(int index = 0; index != total; ++index){
func(*input_ptr, *(input_ptr + 1), *(input_ptr + 2));
input_ptr += 3;
}

return func;
}

/**
* overload, haven't find a good solution to reduce redundancy codes yet
*/
template<typename T, typename TriFunc>
TriFunc process_three_continuous_channels_impl(cv::Mat const &input, TriFunc func)
{
int const total = input.total();
auto const *input_ptr = input.ptr<T>(0);
for(int index = 0; index != total; ++index){
func(*input_ptr, *(input_ptr + 1), *(input_ptr + 2));
input_ptr += 3;
}

return func;
}

我想减少冗余代码,但找不到好的解决方案

template<typename T, typename TriFunc>
TriFunc process_three_continuous_channels_impl(cv::Mat const &input, TriFunc func)
{
return process_three_continuous_channels_impl<T>(const_cast<cv::Mat&>(input, func));
}

这是行不通的,因为 func 可以在 const_cast 之后改变输入的数据将非 const cv::Mat 转换为 const 也无法工作,那样 func 将无法工作改变输入的数据。有什么建议吗?

最佳答案

您可以使 cv::Mat 参数成为对模板参数类型的引用。

template<typename Mat, typename T, typename TriFunc>
TriFunc process_three_continuous_channels_impl(Mat&& input, TriFunc func)
{
int const total = std::forward<Mat>(input).total();
auto input_ptr = std::forward<Mat>(input).template ptr<T>(0);
for(int index = 0; index != total; ++index){
func(*input_ptr, *(input_ptr + 1), *(input_ptr + 2));
input_ptr += 3;
}

return func;
}

关于c++ - 减少重载函数的冗余代码(const& vs &),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17942830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com