大家好 代码片段来自opencv-3.2 文件为:Imgwarp.cpp
本人有个疑问:
using namespace cv;
namespace cv
{
….
….
template <int channels, typename Type>
bool IPPSetSimple(cv::Scalar value, void *dataPointer, int step, IppiSize &size, ippiSetFunc func)
{
CV_INSTRUMENT_REGION_IPP()
Type values[channels];
for( int i = 0; i < channels; i++ )
values[i] = saturate_cast<Type>(value[i]);
return func(values, dataPointer, step, size) >= 0;
}
….
….
1,以上表达式模板类 还是模板? IPPSetSimple
2,当函数发生调用的时候表达式为:
return IPPSetSimple<3, Ipp32f>(value, dataPointer, step, size, (ippiSetFunc)ippiSet_32f_C3R);
以上<>中传递的参数怎么使用?这是模板的非类型参数传递吗?
3,本人看到了网上介绍是模板类可以这么传递参数,但是模板函数为什么也能这么传递参数?
4,template<typename _Tp>
static inline _Tp saturate_cast(uchar v)
{
return _Tp(v);
}
同样以上这个模板的函数?调用的时候也是saturate_cast<Type>(value[i]);
这是参数传递还是制定了参数的类型?
5,saturate_cast函数中有 return _Tp(v);这是不是说要把v的类型强制转换为调用时候传入的<>内容?
谢谢大家,希望高手回答一下。
本人有个疑问:
using namespace cv;
namespace cv
{
….
….
template <int channels, typename Type>
bool IPPSetSimple(cv::Scalar value, void *dataPointer, int step, IppiSize &size, ippiSetFunc func)
{
CV_INSTRUMENT_REGION_IPP()
Type values[channels];
for( int i = 0; i < channels; i++ )
values[i] = saturate_cast<Type>(value[i]);
return func(values, dataPointer, step, size) >= 0;
}
….
….
1,以上表达式模板类 还是模板? IPPSetSimple
2,当函数发生调用的时候表达式为:
return IPPSetSimple<3, Ipp32f>(value, dataPointer, step, size, (ippiSetFunc)ippiSet_32f_C3R);
以上<>中传递的参数怎么使用?这是模板的非类型参数传递吗?
3,本人看到了网上介绍是模板类可以这么传递参数,但是模板函数为什么也能这么传递参数?
4,template<typename _Tp>
static inline _Tp saturate_cast(uchar v)
{
return _Tp(v);
}
同样以上这个模板的函数?调用的时候也是saturate_cast<Type>(value[i]);
这是参数传递还是制定了参数的类型?
5,saturate_cast函数中有 return _Tp(v);这是不是说要把v的类型强制转换为调用时候传入的<>内容?
谢谢大家,希望高手回答一下。
解决方案
10
都是函数模版,调用的时候 <> 显示指定模版参数。
40
1、这里只是一个函数模板
2、<>中的是模板参数,用于实例化模板
3、原理是一样的,其次 不要一直说模板类,你想表达的应该是类模板
4、Type是实际使用的模板参数类型
5、是的,将v转换为_Tp
2、<>中的是模板参数,用于实例化模板
3、原理是一样的,其次 不要一直说模板类,你想表达的应该是类模板
4、Type是实际使用的模板参数类型
5、是的,将v转换为_Tp
10
模板类和模板函数名称不同但是他们的都是可以这样传参。