首页 > 解决方案 > 生成指针元组

问题描述

我有一个类似于printf(可变参数列表)的函数,例如:

void some_func(void* object, const char* format, ...)
{
    va_list vl;
    va_start(vl, format);
    int** arg1 = va_arg(vl, int**);
    char** arg2 = va_arg(vl, char**);
    va_end(vl);
    
    if (arg1 && *arg1)
    {
        *arg1 = 1024;
    }
    
    if (arg2)
    {
        *arg2 = new char[...];
        strcpy(....);
    }
}

我需要在元组中生成变量来调用它,因为我不想手动创建它需要的每个变量(我不想做下面的事情):

int arg1 = 0;
char* arg2 = nullptr;
float arg3 = 0.0;
other_variables...
some_func(nullptr, "format", &arg1, &arg2, &arg3, &other_variables...);

所以我想出了生成参数元组并通过引用/地址将它们传递给上述函数的想法std::apply

template <typename R, typename... Args>
R call_func(R(*some_func)(Args...), void* object, const char* format)
{
    std::tuple<void*, const char*, Args...> args = std::tuple_cat(std::make_tuple<void*, const char*>(object, format), std::tuple<Args...>());

    std::apply(some_func, args); //Call `some_func` with the tuple arguments..

    //trim tuple removing `object` and `format`
    //then print results..
    printf("%d", std::get<0>(args));  //print arg1 from `some_func`
    printf("%c", std::get<1>(args));  //print arg2 from `some_func`
}

如果我按值传递所有参数,它会起作用。

如何Args...通过地址传递元组?我是否必须创建第二个元组来获取第一个变量的地址,以及如何创建?

标签: c++c++17

解决方案


据我了解,您需要将调用调整为:

std::apply([](void* object, const char* format, auto&... args){
    some_func(object, format, &args);}, args);

推荐阅读