递归可变参数模板函数调用 "loses" 第二个参数类型的指针

recursive variadic template function call "loses" pointer on second argument type

我有一个函数 (GetArgs) 使用可变参数模板对它的参数(每个指针)进行排序,将每个参数发送到另一个函数 (GetArg)每种类型都被重载了(目前是 int 和 float)。每种类型的重载函数然后在指针处设置值。

它编译得很好,当我用单一类型的许多参数调用函数时,它 运行 很好。但是,如果我使用这两种类型(float 和 int),它将 运行 正常,直到第一次出现第二种类型,崩溃,因为(据我所知)指针地址为空(调试器中为 0x0)。

这是我的函数定义(在 main 中包含的命名空间中声明):

namespace.h

int GetArg(int iStackPos,int *i);
int GetArg(int iStackPos,float *f);

template<typename tFirst> int GetArgs(tFirst first)
    {
        GetArg(-1,first);
    }

template<typename tFirst, typename... tRest> int GetArgs(tFirst first, tRest... rest)
    {
        int iStackPos = ((sizeof...(rest) + 1) * -1);


        GetArg(iStackPos,first);
        GetArgs((rest)...);

        return 0;
    }

namespace.cpp

int GetArg(int iStackPos,int *i)
    {
        *i = 1;
    }

int GetArg(int iStackPos,float *f)
    {
        *f = 2.5;
    }

在 main 中调用以获取参数:

运行 会很好:

int *i1;
float *f1;

namespace::GetArgs(f1,f1,f1,f1); //no use of int

会崩溃:

int *i1;
float *f1;

namespace::GetArgs(f1,i1,f1); //use of int

int在前float在后也是一样。 空指针发生在递归 GetArgs() 调用中,而崩溃的发生是因为重载的 int GetArg() 试图写入它。 iStackPos 用作 lua 堆栈上的位置,因为这意味着作为从 lua 获取参数的包装器。但是,我已经将 lua 代码替换为仅分配 int 1、float 2.5,因为 lua 代码不是'不是这个问题。

正如其他人已经建议的那样,您正在将未初始化的内存传递给您的函数。这会产生未定义的行为。

此外,您不会在 GetArg 函数和第一个 GetArgs 函数中返回任何内容。这也会给您带来麻烦。

还有你在计算 iStackPos 时结合 size_t 和 int。