C++ 具有函数参数的结构
我可以假设,从调用堆栈的角度来看,调用function1这样的函数也是一样的吗C++ 具有函数参数的结构,c++,templates,C++,Templates,我可以假设,从调用堆栈的角度来看,调用function1这样的函数也是一样的吗 int function1(T1 t1, T2 t2); 而不是另一个类似的函数2 struct parameters_t { Wide<T1>::type t1; Wide<T2>::type t2; } int function2(parameters_t p); 谢谢 你问的其实是两个不同的问题。我认为不能保证这两个方法在调用堆栈上看起来是相同的,但是为了您需要将
int function1(T1 t1, T2 t2);
而不是另一个类似的函数2
struct parameters_t
{
Wide<T1>::type t1;
Wide<T2>::type t2;
}
int function2(parameters_t p);
谢谢 你问的其实是两个不同的问题。我认为不能保证这两个方法在调用堆栈上看起来是相同的,但是为了您需要将参数传递给指针调用的函数,它可以工作
<>你也许应该考虑通过引用或指针传递它。一次又一次地传递大型结构物将是低效的。问题1。不,这两个函数调用不一定相同——从右向左和从左向右推送参数的调用约定都被广泛使用
听起来像是要创建一个函数,该函数接受可变数量的可变类型的参数。要做到这一点,我需要它使用类似于
std::vector
的参数 你当然是对的,你说的和我说的一样,但是如果你要使用这个方法,把这个向量放到一个args类或结构中,然后模板,这样以后你就可以添加更多不同类型的参数,而不需要对API做任何更改。@San Jacint:哦,是的,这个主题肯定有很多变化。底线是找出你真正需要的,然后(直接)去做。如果你对编译器撒谎,它会报复的,并且试图将单个参数传递给定义为接受结构的对象(反之亦然)直接属于这一类…好的。它之所以有效,是因为我使用了gcc,它从右向左推送参数,但不同平台之间的寄存器使用情况确实存在差异。我不希望编译器以后报复我:)谢谢你们!
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);