获取在变量参数列表中传递的参数类型

时间:2013-06-07 15:15:38

标签: c++ opencv variadic-functions

我编写了一个带有变量参数列表

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

3 个答案:

答案 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 );