我正在将一个 ComputerVision 项目移植到 OpenFrameworks,其中一部分是模拟库的一些小部分,我正在为此编写自己的库,更轻量级的帮助类。
我有 vector 和矩阵,我使用 OpenCV 类 cv::Vec
和 cv::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/