为可变参数打包数组
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);
}
唯一的要求是你需要知道你想在编译时解压的东西的大小。或者至少你需要猜测然后在运行时崩溃。
我知道从 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);
}
唯一的要求是你需要知道你想在编译时解压的东西的大小。或者至少你需要猜测然后在运行时崩溃。