假设我有以下tuple
:
std::tuple<int, int, int> setVals(int val)
{
return std::make_tuple(val, val, val);
}
有这样的结构化绑定真的很好:auto [x, y, z] = setVals(42);
是否可以为setVals
提供某种可变签名,这样我就可以使用任何数量的变量进行结构化绑定?例如,auto [x, y] = setVals(42);
或auto [x, y, z, x2, y2, z2] = setVals(42);
我知道我可以使用一个可变函数模板,在那里我可以声明一些int并将它们作为引用传递,但结构化绑定非常方便,我想知道我刚才展示的东西是否可能。如果这个问题不好,我很抱歉。
您可以创建一个想要的函数,但必须指定元组的元素数量作为模板参数。这会给你这样的代码:
// does the actual creation
template <typename T, std::size_t... Is>
auto create_tuple_helper(const T& initial_value, std::index_sequence<Is...>)
{
// this ueses the comma expression to discard Is and use initial_value instead for each element
return std::tuple{(void(Is), initial_value)...};
// void(Is) is used to get rid of a warning for an unused value
}
// this is a wrapper and makes it easy to call the helper function
template <std::size_t N, typename T>
auto create_tuple(const T& initial_value)
{
return create_tuple_helper(initial_value, std::make_index_sequence<N>{});
}
int main()
{
auto [a, b, c, d] = create_tuple<4>(42);
std::cout << d;
}
实例