Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有函数参数的结构_C++_Templates - Fatal编程技术网

C++ 具有函数参数的结构

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); 谢谢 你问的其实是两个不同的问题。我认为不能保证这两个方法在调用堆栈上看起来是相同的,但是为了您需要将

我可以假设,从调用堆栈的角度来看,调用function1这样的函数也是一样的吗

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