5

我写了一个带有可变参数列表的函数

void cvShowMatImages( char* title, int nArgs, ...)  // Mat Images

其中要传递的参数是 openCV 图像。对于 2 种图像格式 IplImage 和 Mat,我实际上有 2 个不同的功能,上面提到的和第二个

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=。有没有办法解决这个问题?

4

3 回答 3

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 }) ;    
} 
于 2013-06-07T16:32:42.393 回答
0

首先感谢大家的付出!

我没有符合 C++11 的编译器,因此您的某些建议将无法正常工作。

无论如何,我找到了一个相当简单的解决方案——我从没想过它会起作用!- 这只是将包含 IplImage 的参数转换为 Mat!

例子:

cvShowMatImages( "all my Ipl and Mat images", 2, myMatImage, (Mat)myIplImage );
于 2013-06-08T00:24:36.537 回答
0

我宁愿考虑传递元组或数组或向量。

std::array带有 N 的模板一样,也可以使您的函数成为带有 N 的模板,并以通用方式实现。如果您的编译器适合它,可变参数模板也是可行的。

... 是我们试图摆脱的东西。传递任何非 POD 都是未定义的行为,并且不可能进行类型检查。是什么让它太容易出错。对于您的情况,它也不是很有帮助。

于 2013-06-07T15:26:24.420 回答