可变变量的包数组

pack array for variadic

本文关键字:数组 包数组 变量      更新时间:2023-10-16

我知道从Args... args到像这样的数组相对容易:

template<typename...Args> 
void f(Args...args){
    double list[] = {args...};
}

但是,有没有办法回到Args,例如:

template<typename...Args> 
void f(Args...args){
    double list[] = {args...};
    //manipulate list[]
    //convert list to new_args...
    //use it in a function
    any_other_f(new_args...);
}

永不言败。由于您似乎知道list的大小(= sizeof...(args)),因此您可以使用 c++14 库功能试试运气,并创建一个index_sequence,然后用于在解压缩期间为列表编制索引。看这里:http://en.cppreference.com/w/cpp/utility/integer_sequence。底部的示例显示了如何执行此操作。

我的第一次尝试:

#include <iostream>
#include <utility>
using namespace std;
template<typename... Args>
void any_other_f(Args... args)
{
    double list[] = {args...};
    for (auto&& x : list)
        cout << x << ", ";
    cout << "n";
}
template<typename T, size_t... I>
void wrapper_function(T&& t, index_sequence<I...>)
{
    any_other_f(t[I]...);   
}
template<typename...Args> 
void f(Args...args)
{
    constexpr size_t size = sizeof...(args);
    double list[] = {args...};
    for (int i = 0; i < size; ++i)
        list[i] *= -1;
    wrapper_function(list, make_index_sequence<size>());
}
int main() 
{
    f(1.0, 2.0, 3.0);
}

它有效:http://ideone.com/OmfOps。

唯一的要求是你需要知道你想要在编译时解压缩的东西的大小。或者至少你需要做一个猜测,然后在运行时崩溃。

您想要的方式是不可能的。数组的内容是一个动态的东西,函数调用的目标(即使是可变的)是由编译时决定的。你为什么要做这样的事情?也许有更好的方法。