避免在函数调用中计算数组元素

时间:2019-01-07 12:31:17

标签: c++ typedef function-call

我正在定义一个函数签名,以便执行远程过程调用。由于undefined behavior,我无法在调用表达式中增加索引变量,因此我最终从0开始计数到最后一个索引,并将每个变量作为参数传递给函数。有没有一种更优雅的方式可以实现这一目标而无需计算?我在想一个循环之类的东西。当固定参数计数更改为例如时,这将派上用场。 16个参数而不是8

typedef unsigned long long int functionType(int, int, int, int, int, int, int, int);

unsigned long long int call_address(uintptr_t real_address, const unsigned int *arguments) {
    auto function = (functionType *) real_address;

    // We count instead of incrementing an index variable because: operation on 'argumentIndex' may be undefined
    return function(arguments[0], arguments[1],
                    arguments[2], arguments[3],
                    arguments[4], arguments[5],
                    arguments[6], arguments[7]);
}

我知道variable arguments使用va_startva_listva_end,但是我不确定是否可以在这里使用它们。

1 个答案:

答案 0 :(得分:4)

A part of your solution involves unpacking a fixed amount of values from your arguments array and calling function with it. The following C++14 code will do that:

template <typename F, size_t... Is>
unsigned long long int our_invoke(F f, const unsigned int * args, std::index_sequence<Is...>) {
    return f(args[Is]...);
}

unsigned long long int call_address(uintptr_t real_address, const unsigned int *arguments) {
    auto function = (functionType *) real_address;

    return our_invoke(function, arguments, std::make_index_sequence<8>{});
}