在 C++17 中解压可变元组
Unpacking variadic tuples in c++17
在 c++17(也许是 C++2a)中有什么比使用 std::index_sequence
解压可变参数元组的经典 C++14 方法更好的吗?
还有比这更好的:
template <typename ...I>
class MultiIterator
{
public:
MultiIterator(I const& ...i)
: i(i...)
{}
MultiIterator& operator ++()
{
increment(std::index_sequence_for<I...>{});
return *this;
}
private:
template <std::size_t ...C>
void increment(std::index_sequence<C...>)
{
std::ignore = std::make_tuple(++std::get<C>(i)...);
}
std::tuple<I...> i;
};
喜欢fold expression, structured-bindings?有什么提示吗?我可以接受为什么我不能在这里使用这些提到的 C++17 功能的答案——但我更喜欢“解决方案。
从 C++14 开始,我们有了泛型 lambda,从 C++17 开始,我们有了折叠表达式,std::apply
有效地隐藏了通常的解包逻辑:
std::apply( [](auto&... i){ ((void)++i,...); }, some_tuple );
注意:供您参考,(void) 只是为了避免使用任何自定义逗号运算符......你永远不知道:)
在 c++17(也许是 C++2a)中有什么比使用 std::index_sequence
解压可变参数元组的经典 C++14 方法更好的吗?
还有比这更好的:
template <typename ...I>
class MultiIterator
{
public:
MultiIterator(I const& ...i)
: i(i...)
{}
MultiIterator& operator ++()
{
increment(std::index_sequence_for<I...>{});
return *this;
}
private:
template <std::size_t ...C>
void increment(std::index_sequence<C...>)
{
std::ignore = std::make_tuple(++std::get<C>(i)...);
}
std::tuple<I...> i;
};
喜欢fold expression, structured-bindings?有什么提示吗?我可以接受为什么我不能在这里使用这些提到的 C++17 功能的答案——但我更喜欢“解决方案。
从 C++14 开始,我们有了泛型 lambda,从 C++17 开始,我们有了折叠表达式,std::apply
有效地隐藏了通常的解包逻辑:
std::apply( [](auto&... i){ ((void)++i,...); }, some_tuple );
注意:供您参考,(void) 只是为了避免使用任何自定义逗号运算符......你永远不知道:)