其他分享
首页 > 其他分享> > c – Boost得到第一个匹配的索引

c – Boost得到第一个匹配的索引

作者:互联网

所以我试图使用boost :: hana创建一个库,它需要函数来根据值获取元素的索引:

constexpr auto tup = boost::hana::make_tuple(3_c, boost::hana::type_c<bool>);

auto index = get_index_of_first_matching(tup, boost::hana::type_c<bool>);
//   ^^^^^ would be a boost::hana::int_<1>

有可能这样做吗?更好的是,它是否已经在hana中,我不知道它?

感谢您的支持!

解决方法:

Hana没有提供开箱即用的算法.如果它看起来像一个非常理想的功能,我可以相当容易地添加这样的算法.它可能很适合作为任何Iterable接口的一部分,因为Iterables是索引有意义的那些序列.

目前,我会在他的评论中提出与@cv_and_he提出的非常接近的内容:

#include <boost/hana.hpp>
namespace hana = boost::hana;

template <typename Iterable, typename T>
constexpr auto index_of(Iterable const& iterable, T const& element) {
    auto size = decltype(hana::size(iterable)){};
    auto dropped = decltype(hana::size(
        hana::drop_while(iterable, hana::not_equal.to(element))
    )){};
    return size - dropped;
}

constexpr auto tuple = hana::make_tuple(hana::int_c<3>, hana::type_c<bool>);
constexpr auto index = index_of(tuple, hana::type_c<bool>);
static_assert(index == hana::size_c<1>, "");

int main() { }

关于上述代码的一些注意事项.首先,Hana中的索引必须是非负的,因此使用无符号类型可能是个好主意.其次,我使用hana :: drop_while而不是hana :: take_while,因为前者只需要一个Iterable,而后者需要一个Sequence.虽然看起来我正在做更多的工作(计算两次大小),但事实证明,计算你将遇到的大多数序列的大小非常快,所以它并不是真正的问题.最后,我在decltype中包含了hana :: size(hana :: drop_while(…)),这确保了在运行时无论如何都无法完成任何工作.

标签:boost-hana,c,c11,boost,template-meta-programming
来源: https://codeday.me/bug/20190829/1761759.html