将缺少的参数添加到另一个函数中的函数指针

Adding missing arguments to function pointer in another function

我想使用函数指针调用一些函数。它们有不同的参数和数据类型。

void processVec2(
    float a, 
    float b, 
    array<vector2> vec2_array, 
    int i, 
    int j)
{
/// some code here    
}
void processVec3(
    float a, 
    float b, 
    float c,
    float d, 
    array<vector3> vec3_array, 
    int i, 
    int j)
{
/// some code here    
}

我想在循环函数中传递函数,并且我想在调用传递的函数之前添加循环迭代索引作为参数。

template<typename T, typename ... Args>
void loopFunction(
    int       iter,
    array<T>  array,
    void (*function)(Args)
    )
{
    // loop on iter
    for(int i = 0; i < iter; ++i)
    {
        // Loop on input array size
        int arraySize = array.size()
        for(int j = 0; j < arraySize, ++j)
        {
            function(args, i, j) // calling function. I want to pass some arguments and also i and j.
        }
    }
}

这就是我要设置函数指针的地方。但是,我不知道如何让它接受它的变量,而且我也不能在主函数中设置循环索引变量,所以函数指针的参数都会缺少两个 int。

// Main function
void main(
    float          a,
    float          b,
    float          c,
    float          d,
    int            vec2_iter,
    int            vec3_iter,
    array<vector2> vec2_array,
    array<vector3> vec3_array)
{
    // Call loopFunction, passing processVec2 as function pointer argument. I need to set the function's argument here too.
    loopFunction<vector2>(vec2_iter, vec2_array, &processVec2(a, b vec2_array));

    // Call loopFunction, passing processVec3 as function pointer argument. I need to set the function's argument here too.
    loopFunction<vector3>(vec3_iter, vec3_array, &processVec3(a, b, c, d, vec3_array));
}

对于循环函数,我只需要_iter、_array 和函数指针。但是,我需要将参数从主函数传递给函数指针,而不是将它们显式传递给循环函数。

这可能吗?

您需要更改loopFunction以获取您要传递的附加参数,在函数指针类型中扩展参数包并在调用函数指针时传递参数:

template<typename T, typename ... Args>
void loopFunction(
    int       iter,
    array<T>  array,
    void (*function)(Args..., int, int),
    Args... args
    )
{
    // loop on iter
    for(int i = 0; i < iter; ++i)
    {
        // Loop on input array size
        int arraySize = array.size();
        for(int j = 0; j < arraySize; ++j)
        {
            function(args..., i, j);
        }
    }
}

然后在调用函数中(注意这里不能叫main)获取函数指针时不能传参,需要直接传给loopFunction

// Call loopFunction, passing processVec2 as function pointer argument. I need to set the function's argument here too.
loopFunction<vector2>(vec2_iter, vec2_array, &processVec2, a, b, vec2_array);

// Call loopFunction, passing processVec3 as function pointer argument. I need to set the function's argument here too.
loopFunction<vector3>(vec3_iter, vec3_array, &processVec3, a, b, c, d, vec3_array);

使用 lambda 表达式可能更简单:

template<typename T, typename Function>
void loopFunction(
    int       iter,
    array<T>  array,
    Function function
    )
{
    // loop on iter
    for(int i = 0; i < iter; ++i)
    {
        // Loop on input array size
        int arraySize = array.size();
        for(int j = 0; j < arraySize; ++j)
        {
            function(i, j);
        }
    }
}

// Call loopFunction, passing processVec2 as function pointer argument. I need to set the function's argument here too.
loopFunction<vector2>(vec2_iter, vec2_array, [&](int i, int j){ processVec2(a, b, vec2_array, i, j); });

// Call loopFunction, passing processVec3 as function pointer argument. I need to set the function's argument here too.
loopFunction<vector3>(vec3_iter, vec3_array, [&](int i, int j){ processVec3(a, b, c, d, vec3_array, i, j); });