gpt4 book ai didi

c++ - 使用 std::get、std::tuple_size、std::tuple_element 对元组的组件求和

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:21 25 4
gpt4 key购买 nike

我有一个自定义类,它有一个类似元组的接口(interface)。因为我希望我的代码尽可能通用,所以我认为将我的算法基于函数 std::getstd::tuple_size 是个好主意>, std::tuple_element 所以你只需要专门化这些函数来使用我的算法。我们将需要这些函数特化的概念称为元组

现在我试图总结一个元组的组成部分。函数声明应该是这样的:

template <class Tuple>
int sum_components(const Tuple& t);

我想这涉及到很多模板编程,但我就是不知道该怎么做。

对于添加,我将只使用全局 + 运算符 的重载。

我正在使用 c++1z。

最佳答案

这在 中非常容易.

template<class Tuple>
decltype(auto) sum_components(Tuple const& tuple) {
auto sum_them = [](auto const&... e)->decltype(auto) {
return (e+...);
};
return std::apply( sum_them, tuple );
};

(...+e) 用于相反的折叠方向。

在以前的版本中,正确的方法是编写您自己的 apply 而不是编写定制的实现。当您的编译器更新时,您可以删除代码。

,我可能会这样做:

// namespace for utility code:
namespace utility {
template<std::size_t...Is>
auto index_over( std::index_sequence<Is...> ) {
return [](auto&&f)->decltype(auto){
return decltype(f)(f)( std::integral_constant<std::size_t,Is>{}... );
};
}
template<std::size_t N>
auto index_upto() {
return index_over( std::make_index_sequence<N>{} );
}
}
// namespace for semantic-equivalent replacements of `std` code:
namespace notstd {
template<class F, class Tuple>
decltype(auto) apply( F&& f, Tuple&& tuple ) {
using dTuple = std::decay_t<Tuple>;
auto index = ::utility::index_upto< std::tuple_size<dTuple>{} >();
return index( [&](auto...Is)->decltype(auto){
auto target=std::ref(f);
return target( std::get<Is>( std::forward<Tuple>(tuple) )... );
} );
}
}

这非常接近 中的 std::apply . (我滥用 std::ref 来获取 INVOKE 语义)。 (它不能与右值调用器完美配合,但这是非常极端的情况)。

,我建议此时升级您的编译器。在 我建议此时升级你的工作。


以上所有的都做右折或左折。在某些情况下,二叉树折叠可能会更好。这比较棘手。

如果您的 + 执行表达式模板,由于生命周期问题,上述代码将无法正常工作。在某些情况下,您可能必须为“afterwards, cast-to”添加另一个模板类型以导致临时表达式树求值。

关于c++ - 使用 std::get、std::tuple_size、std::tuple_element 对元组的组件求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40700181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com