c++ - 如何定义使用模板类但没有该类的所有参数的模板函数?

标签 c++ opencv templates

我正在将一个 ComputerVision 项目移植到 OpenFrameworks,其中一部分是模拟库的一些小部分,我正在为此编写自己的库,更轻量级的帮助类。

我有 vector 和矩阵,我使用 OpenCVcv::Veccv::Matx。它们是功能很少的简单容器,但对大多数情况来说都很好。

我尝试模拟的函数是一个切片函数。基本上取一行矩阵并返回一个 vector ,或者取一个 vector 的子集并返回较小的 vector 。现在我有这样的东西:

template<typename Precision, int Start, int Length, int X>
cv::Vec<Precision, Length> slice(cv::Vec<Precision, X> v)
{
    assert(Start >= 0);
    assert((Start+Length) <= X);

    cv::Vec<Precision, Length> temp;

    for (int i = 0; i < Length; i++)
        temp[i] = v[Start+i];

    return temp;
}

我会这样使用它:

cv::Vec<double, 3> newVector = ImpUtil::slice<double, 3, 3, VectorLength>(vector);

cv::Vec 没有成员告诉您它的长度,所以我现在无论如何都必须传递长度。这就是我计划在某个时候为此编写自己的类(class)的原因之一。

问题是我正在使用一个使用模板类的模板函数。然而,整个函数的 int X/VectorLength 部分纯粹是为了类,我想知道我是否可以以某种方式删除它(是的,这意味着删除现在'断言')。该函数应该与任何长度的 vector 一起工作,除了断言(我可能在某些时候从 vector 中得到)之外,它在函数中没有用处。

最佳答案

我想猜测这里的问题是什么。

我想您要解决的问题是必须明确指定“明显的”模板参数:

cv::Vec<double, VectorLength> vector; // did I guess this declaration right?
...
cv::Vec<double, 3> newVector = ImpUtil::slice<double, 3, 3, VectorLength>(vector);

在这段代码中,很明显 vector 的长度为 3 并且包含 double,但您必须在 slice 的尖括号中指定它>.

如果这是您要解决的问题,只需重新排列模板参数,让“明显”的参数排在最后。如果您没有指定所有模板参数,the compiler will deduce the missing ones at the end .

template<int Start, int Length, typename Precision, int X>
cv::Vec<Precision, Length> slice(cv::Vec<Precision, X> v);

...

cv::Vec<double, VectorLength> vector; // I guessed this declaration
...
cv::Vec<double, 3> newVector = ImpUtil::slice<3, 3>(vector);

关于c++ - 如何定义使用模板类但没有该类的所有参数的模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43227353/

相关文章:

c++ - 如何调用特定于 C++ 子类的方法

c++ - 结构错误 : Request for member

c++ - Hausdorff 距离目标检测

c++ - 通用回调

python - 我在哪里可以下载示例 Django 模板?

c++ - 联盟 : Reading from one data member of a union to write into another

c# - Visual Studio 扩展 (VSIX/DLL) 到一个 exe

opencv - 图像中的错误级别分析

c++ - 图像处理

c++ - 依赖基类中的常量使外部定义不匹配?