为可变参数打包数组

pack array for variadic

我知道从 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.

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