C++ 生成指针的元组

C++ 生成指针的元组,c++,c++17,C++,C++17,我有一个类似于printf(可变参数列表)的函数,如: 我需要在元组中生成变量来调用它,因为我不想手动创建它需要的每个变量(我不想执行以下操作): 因此,我想到了生成一个参数元组的想法,并使用std::apply: template <typename R, typename... Args> R call_func(R(*some_func)(Args...), void* object, const char* format) { std::tuple<void*,

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

我需要在元组中生成变量来调用它,因为我不想手动创建它需要的每个变量(我不想执行以下操作):

因此,我想到了生成一个参数元组的想法,并使用
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`
}
模板
R调用函数(R(*some函数)(参数…,void*对象,const char*格式)
{
std::tuple args=std::tuple_cat(std::make_tuple(对象,格式),std::tuple());
std::apply(some_func,args);//使用元组参数调用'some_func'。。
//修剪元组删除'object'和'format'`
//然后打印结果。。
printf(“%d”,std::get(args));//从'some_func'打印arg1`
printf(“%c”,std::get(args));//从'some_func'打印arg2`
}
如果我通过值传递所有参数,它就会工作


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

据我所知,您需要将调用调整为:

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

为什么不首先使用可变模板呢。我不理解从
va_args
开始的好处,我不理解您的示例(也是因为它不完整),因此我无法提出任何具体的建议,但在这里您可以找到一个类似于
printf
tprintf
示例。它非常简单,适用于任何开箱即用的类型。您不应该向
std::make_tuple
提供模板参数,它的目的是推断类型…printf,并且您的函数有容易出错的缺点,例如参数的格式说明符错误,一个格式说明符太多,等等。为什么不看看他们是如何在fmt()中使用的呢?这似乎是一个更好的方法。@idclev463035818我首先不能使用可变模板,因为我调用的是
C
函数。我只是添加了
some_func
作为我试图调用的函数的示例。我实际上试图调用的函数是
PyAPI\u FUNC(int)PyArg\u ParseTuple(PyObject*,const char*,…)
,这就是为什么我想用变量模板函数包装它,该函数使用正确的参数调用它。
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`
}
std::apply([](void* object, const char* format, auto&... args){
    some_func(object, format, &args);}, args);