我编写了一个带有变量参数列表
的函数void cvShowMatImages( char* title, int nArgs, ...) // Mat Images
传递的参数是openCV图像。 我实际上有两种不同的功能,用于2种图像格式IplImage和Mat,上面提到的和第二种
void cvShowIplImages( char* title, int nArgs, ...) // Ipl Images
但我无法混合两种类型的图像。 如果我能够确定传递的参数类型,我可以解决我的问题,但我不知道该怎么做。 这就是我读这个论点的方式:
// Get the images passed as arguments
va_list args;
// Initialize the variable argument list
va_start( args, nArgs );
// Loop on each image
for ( int num = 0; num < nArgs; num++ )
{
// Get the image to be copied from the argument list
srcImg = va_arg( args, Mat );
...
和IplImage:
srcImg = va_arg( args, IplImage* );
在这两种情况下,srcImg都声明为
Mat srcImg
因为IplImage有一个重载的operator =。 有没有办法解决这个问题?
答案 0 :(得分:1)
以这种方式使用variadic templates
是一种可能的解决方案:
#include <iostream>
template<typename... Args> void func(double t, Args... args) ;
template<typename... Args> void func(int t, Args... args) ;
void func(int t)
{
std::cout << "int: "<< t << std::endl ;
}
void func(double t)
{
std::cout << "double: "<< t << std::endl ;
}
template<typename... Args>
void func(double t, Args... args)
{
func(t) ;
func(args...) ;
}
template<typename... Args>
void func(int t, Args... args)
{
func(t) ;
func(args...) ;
}
int main()
{
int x1 = 1, x2 = 5 ;
double d1 = 2.5 , d2 = 3.5;
func( x1 , d1, x2 ) ;
func( x1 , d1, d2 ) ;
}
它不是很优雅,但它可能有助于解决您的问题。另一种方法是为每种类型使用两个std::initializer_list
,如下所示:
#include <iostream>
#include <initializer_list>
void func2( std::initializer_list<int> listInt, std::initializer_list<double> listDouble )
{
for( auto elem : listInt )
{
std::cout << "Int: " << elem << std::endl ;
}
for( auto elem : listDouble )
{
std::cout << "double: " << elem << std::endl ;
}
}
int main()
{
func2( {10, 20, 30, 40 }, {2.5, 2.5 }) ;
}
答案 1 :(得分:0)
我宁愿考虑传递元组或数组或向量。
由于std::array
是带N的模板,因此可以使您的函数成为具有N的模板,并以通用方式实现。如果您的编译器对它有好处,可变模板也是可行的。
...是我们试图摆脱的东西。传递任何非POD是未定义的行为,并且不可能进行类型检查。是什么让它太容易出错。对于你的情况,它也不是很有帮助。
答案 2 :(得分:0)
首先,我感谢大家的贡献!
我没有符合C ++ 11标准的编译器,所以你的一些提案不会起作用。
无论如何,我找到了一个相当简单的解决方案 - 我从未想过会这样做! - 这只是将包含IplImage的参数转换为Mat!
示例:
cvShowMatImages( "all my Ipl and Mat images", 2, myMatImage, (Mat)myIplImage );