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