获取第一个通过的可变参数的地址

问题描述

#include <stdarg.h>

template<typename... Args> 
void Func(Args... args)
{
// WANT: Get the address of the first argument

// TRIED:
// va_list vargs = (char*)&(args);
// va_list vargs = (char*)&(args)...;
// va_list vargs = (char*)&(args...);

// GOT:
// 'args': parameter pack must be expanded in this context
}

我正在编写一个接受N个参数并对所有参数执行某项操作的函数。为此,我想获取可变参数列表的第一个元素的地址。

此后,据我所知,va_arg宏取消了指针的引用,并以假定类型的大小移动了va_list类型的对象

编辑:我可能会做这样的事情:

template<typename... Args> 
void Func(int arg1,Args... args)
{
// Code
}

但是,这将导致我不需要的更多代码行。

解决方法

更简单的方法是在签名中分割参数:

template <typename T,typename... Ts> 
void Func(T arg,Ts... args)
{
// WANT: Get the address of the first argument
    T* p = &arg;
}

其他

template <typename... Ts> 
void Func(Ts... args)
{
// WANT: Get the address of the first argument
    auto* p = std::get<0>(std::make_tuple(&args...));
}