1
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));
}

const_cast が非 const cv::Mat を const にキャストした後に func が入力のデータを変更できるため、これは機能しません。そのようにすれば、func はデータを変更できません。入力の。助言がありますか?

4

2 に答える 2

1

C++11 がオプションである場合、ここで完全転送が機能します。

template <typename T, typename TriFunc>
TriFunc wrapper(cv::Mat && input, TriFunc func)
{
    return process_three_continuous_channels_impl<T>(
        std::forward(input), func);
}
于 2013-07-30T09:18:13.347 に答える
1

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;
}
于 2013-07-30T09:19:19.483 に答える