gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:12:37 25 4
gpt4 key购买 nike

我正在将一个 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/

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