带有容器和默认分配器的模板模板参数:我可以使我的声明更紧凑吗?

时间:2013-12-10 14:39:46

标签: c++ templates opencv

我正在看这个有趣的主题: https://stackoverflow.com/a/16596463/2436175

我的具体情况涉及使用来自opencv的cv :: Point_和cv :: Rect_的std容器声明模板化函数。 我想反对模板:

  • 我将使用的std容器的类型
  • 完成cv :: Point_和cv :: Rect _
  • 定义的基本数据类型

我最终得到了以下声明:

template <typename T, template <typename, typename> class Container_t>
    void CreateRects(const Container_t<cv::Point_<T>,std::allocator<cv::Point_<T> > >& points,
                     const T value,
                     Container_t<cv::Rect_<T>,std::allocator<cv::Rect_<T> > >& rects) {

    }

编译好了:

void dummy() {

const std::vector<cv::Point_<double> > points;
std::vector<cv::Rect_<double> > rects;
CreateRects(points,5.0,rects);

}

(我也看到我也可以使用,例如CreateRects<double>(points,5,rects)

我想知道是否存在任何方式使我的声明更紧凑,例如无需指定默认分配器的2倍。

2 个答案:

答案 0 :(得分:11)

您可以将模板模板参数Container_t的模板参数说明添加到功能模板中:

template
    <
        typename T,
        template
            <
                typename U,
                typename = std::allocator<U>
            >
        class Container_t
    >
void CreateRects
    (
        const Container_t<cv::Point_<T> >& points,
        const T value,
        Container_t<cv::Rect_<T> >& rects
    )
{

}

或者您可以使用C ++ 11可变参数模板:

template
    <
        typename T,
        template <typename...> class Container_t
    >
void CreateRects
    (
        const Container_t<cv::Point_<T>>& points,
        const T value,
        Container_t<cv::Rect_<T>>& rects
    )
{

}

答案 1 :(得分:0)

如何使用简单的代码:

template <typename T, class C1, class C2>
void CreateRects(const C1& points,
                 const T value,
                 C2& rects) {

}

它更容易阅读,编译,如果类型不匹配,您将收到编译器错误。