2010-02-17 78 views
1

我可以假设,从调用堆栈点来看,它调用像功能1结构与功能参数

int function1(T1 t1, T2 t2); 

的功能,而不是另一个类似功能2一样的吗?

struct parameters_t 
{ 
    Wide<T1>::type t1; 
    Wide<T2>::type t2; 
} 

int function2(parameters_t p); 

模板宽Ť到所述处理器的字长。 例如,对于32位处理器:

template<typename T, bool b = sizeof(T) >=4 > 
struct Wide 
{ 
    typedef T type; 
}; 

template<typename T> 
struct Wide<T,false> 
{ 
    typedef unsigned int type; 
}; 

我需要做这样的事情:

typedef int (*function_t)(parameters_t); 

function_t function = (function_t) &function1; 

parameters_t params; 
// initialize params 
function(params); 

谢谢!

回答

2

问题1.两个函数调用不一定是相同的 - 调用约定从右向左和从左向右推送参数都广泛使用。

这听起来像你想创建一个函数,它需要一个可变数量的变量类型的参数。要做到这一点,我想它会采用类似std::vector<boost:any>的参数。

+0

你当然是正确的,并且正在说我是同一件事,但如果你打算使用这个方法并将该向量放入一个args类或结构体中,然后再进一步模板化,我会更进一步稍后您可以添加更多不同类型的参数,而无需对API进行任何更改。 – 2010-02-17 00:52:05

+0

@San Jacint:哦,是的,这个主题肯定有不少变化。底线是弄清楚你真正需要什么,然后做(直接)。如果你对编译器说谎,它会得到它的报复,并且试图将单个参数传递给定义了一个结构的东西(反之亦然)直接落入该类别中。 – 2010-02-17 03:09:48

+0

好的。它的工作原理是因为我使用了gcc,它将参数从右到左推进,但确实在不同平台之间的注册使用情况存在差异。 我不希望编译器稍后对我进行报复:) 谢谢你们两位! – 2010-02-17 10:13:13

1

你所问的实际上是两个不同的问题。我不认为这两种方法在调用堆栈上看起来是一样的,但为了您需要将参数传递给指针所调用的函数,它可以工作。

你应该考虑通过引用或指针传递它。一遍又一遍地传递大型结构将效率低下。