C ++ Boost多索引类型识别(C++ Boost multi

编程入门 行业动态 更新时间:2024-10-24 14:25:12
C ++ Boost多索引类型识别(C++ Boost multi-index type identification)

在boost多索引中,我可以通过元编程验证特定索引类型是否有序吗? 有序索引,哈希索引,序列索引等。我可以通过元编程找到它们吗?

假设有一个像这样的索引:

int main() { typedef multi_index_container<double> double_set; return 0; }

我想知道double_set索引是排序还是散列或排序。 当然在这种情况下,它是订购的。

In boost multi-index, can I verify whether a particular index type is ordered/not through meta programming? There are the ordered indexes, hash indexes, sequence indexes etc. Can I find them out through meta programming?

Suppose there is a index like:

int main() { typedef multi_index_container<double> double_set; return 0; }

I want to know whether the double_set index is ordered or hashed or sequenced. Of course in this case, it is ordered.

最满意答案

是:

#include <boost/multi_index_container.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/hashed_index.hpp> #include <boost/multi_index/sequenced_index.hpp> #include <boost/multi_index/random_access_index.hpp> #include <boost/mpl/bool.hpp> #include <boost/mpl/or.hpp> #include <boost/mpl/at.hpp> #include <boost/mpl/not.hpp> #include <boost/mpl/distance.hpp> #include <boost/mpl/begin.hpp> namespace mpl = boost::mpl; namespace mi = boost::multi_index; // // checking for ordered_unique: // template <typename MI> struct is_nth_index_ordered_unique_helper : mpl::false_ {}; template <typename KeyFromValue, typename Compare> struct is_nth_index_ordered_unique_helper< mi::ordered_unique<KeyFromValue,Compare> > : mpl::true_ {}; template <typename TagList, typename KeyFromValue, typename Compare> struct is_nth_index_ordered_unique_helper< mi::ordered_unique<TagList,KeyFromValue,Compare> > : mpl::true_ {}; template <typename MI, int N> struct is_nth_index_ordered_unique : is_nth_index_ordered_unique_helper< typename mpl::at_c< typename MI::index_specifier_type_list, N >::type > {}; // // checking for ordered_non_unique: // template <typename MI> struct is_nth_index_ordered_non_unique_helper : mpl::false_ {}; template <typename KeyFromValue, typename Compare> struct is_nth_index_ordered_non_unique_helper< mi::ordered_non_unique<KeyFromValue,Compare> > : mpl::true_ {}; template <typename TagList, typename KeyFromValue, typename Compare> struct is_nth_index_ordered_non_unique_helper< mi::ordered_non_unique<TagList,KeyFromValue,Compare> > : mpl::true_ {}; template <typename MI, int N> struct is_nth_index_ordered_non_unique : is_nth_index_ordered_non_unique_helper< typename mpl::at_c< typename MI::index_specifier_type_list, N >::type > {}; // // Combined (ordered_{non_,}unique): // template <typename MI, int N> struct is_nth_index_ordered : mpl::or_< is_nth_index_ordered_unique<MI,N>, is_nth_index_ordered_non_unique<MI,N> > {}; // // checking for sequenced: // template <typename MI> struct is_nth_index_sequenced_helper : mpl::false_ {}; template <typename TagList> struct is_nth_index_sequenced_helper< mi::sequenced<TagList> > : mpl::true_ {}; template <typename MI, int N> struct is_nth_index_sequenced : is_nth_index_sequenced_helper< typename mpl::at_c< typename MI::index_specifier_type_list, N >::type > {}; // // test with example container: // typedef mi::multi_index_container<double> double_set_1; BOOST_MPL_ASSERT(( is_nth_index_ordered<double_set_1,0> )); BOOST_MPL_ASSERT(( mpl::not_< is_nth_index_sequenced<double_set_1,0> > )); // or BOOST_STATIC_ASSERT(( is_nth_index_ordered<double_set_1,0>::value )); BOOST_STATIC_ASSERT(( mpl::not_< is_nth_index_sequenced<double_set_1,0> >::value )); // // And now with tag dispatch: // template <typename MI, typename Tag> struct tag_to_n : mpl::distance< typename mpl::begin<typename MI::index_type_list>::type, typename MI::template index<Tag>::iter > {}; template <typename MI, typename Tag> struct is_tagged_index_ordered_unique : is_nth_index_ordered_unique<MI,tag_to_n<MI,Tag>::value> {}; template <typename MI, typename Tag> struct is_tagged_index_ordered_non_unique : is_nth_index_ordered_non_unique<MI,tag_to_n<MI,Tag>::value> {}; template <typename MI, typename Tag> struct is_tagged_index_ordered : is_nth_index_ordered<MI,tag_to_n<MI,Tag>::value> {}; template <typename MI, typename Tag> struct is_tagged_index_sequenced : is_nth_index_sequenced<MI,tag_to_n<MI,Tag>::value> {}; // // test with another example container: // struct as_set {}; struct as_list {}; typedef mi::multi_index_container< double, mi::indexed_by< mi::sequenced< mi::tag<as_list> >, mi::ordered_non_unique< mi::tag<as_set>, mi::identity<double> > > > double_set_2; void fun() { double_set_2 ds2; } BOOST_MPL_ASSERT(( is_nth_index_sequenced<double_set_2,0> )); BOOST_MPL_ASSERT(( is_nth_index_ordered<double_set_2,1> )); BOOST_MPL_ASSERT(( mpl::not_< is_nth_index_ordered<double_set_2,0> > )); BOOST_MPL_ASSERT(( mpl::not_< is_nth_index_sequenced<double_set_2,1> > )); BOOST_MPL_ASSERT(( is_tagged_index_sequenced<double_set_2,as_list> )); BOOST_MPL_ASSERT(( is_tagged_index_ordered<double_set_2,as_set> )); BOOST_MPL_ASSERT(( mpl::not_< is_tagged_index_ordered<double_set_2,as_list> > )); BOOST_MPL_ASSERT(( mpl::not_< is_tagged_index_sequenced<double_set_2,as_set> > ));

Yes:

#include <boost/multi_index_container.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/hashed_index.hpp> #include <boost/multi_index/sequenced_index.hpp> #include <boost/multi_index/random_access_index.hpp> #include <boost/mpl/bool.hpp> #include <boost/mpl/or.hpp> #include <boost/mpl/at.hpp> #include <boost/mpl/not.hpp> #include <boost/mpl/distance.hpp> #include <boost/mpl/begin.hpp> namespace mpl = boost::mpl; namespace mi = boost::multi_index; // // checking for ordered_unique: // template <typename MI> struct is_nth_index_ordered_unique_helper : mpl::false_ {}; template <typename KeyFromValue, typename Compare> struct is_nth_index_ordered_unique_helper< mi::ordered_unique<KeyFromValue,Compare> > : mpl::true_ {}; template <typename TagList, typename KeyFromValue, typename Compare> struct is_nth_index_ordered_unique_helper< mi::ordered_unique<TagList,KeyFromValue,Compare> > : mpl::true_ {}; template <typename MI, int N> struct is_nth_index_ordered_unique : is_nth_index_ordered_unique_helper< typename mpl::at_c< typename MI::index_specifier_type_list, N >::type > {}; // // checking for ordered_non_unique: // template <typename MI> struct is_nth_index_ordered_non_unique_helper : mpl::false_ {}; template <typename KeyFromValue, typename Compare> struct is_nth_index_ordered_non_unique_helper< mi::ordered_non_unique<KeyFromValue,Compare> > : mpl::true_ {}; template <typename TagList, typename KeyFromValue, typename Compare> struct is_nth_index_ordered_non_unique_helper< mi::ordered_non_unique<TagList,KeyFromValue,Compare> > : mpl::true_ {}; template <typename MI, int N> struct is_nth_index_ordered_non_unique : is_nth_index_ordered_non_unique_helper< typename mpl::at_c< typename MI::index_specifier_type_list, N >::type > {}; // // Combined (ordered_{non_,}unique): // template <typename MI, int N> struct is_nth_index_ordered : mpl::or_< is_nth_index_ordered_unique<MI,N>, is_nth_index_ordered_non_unique<MI,N> > {}; // // checking for sequenced: // template <typename MI> struct is_nth_index_sequenced_helper : mpl::false_ {}; template <typename TagList> struct is_nth_index_sequenced_helper< mi::sequenced<TagList> > : mpl::true_ {}; template <typename MI, int N> struct is_nth_index_sequenced : is_nth_index_sequenced_helper< typename mpl::at_c< typename MI::index_specifier_type_list, N >::type > {}; // // test with example container: // typedef mi::multi_index_container<double> double_set_1; BOOST_MPL_ASSERT(( is_nth_index_ordered<double_set_1,0> )); BOOST_MPL_ASSERT(( mpl::not_< is_nth_index_sequenced<double_set_1,0> > )); // or BOOST_STATIC_ASSERT(( is_nth_index_ordered<double_set_1,0>::value )); BOOST_STATIC_ASSERT(( mpl::not_< is_nth_index_sequenced<double_set_1,0> >::value )); // // And now with tag dispatch: // template <typename MI, typename Tag> struct tag_to_n : mpl::distance< typename mpl::begin<typename MI::index_type_list>::type, typename MI::template index<Tag>::iter > {}; template <typename MI, typename Tag> struct is_tagged_index_ordered_unique : is_nth_index_ordered_unique<MI,tag_to_n<MI,Tag>::value> {}; template <typename MI, typename Tag> struct is_tagged_index_ordered_non_unique : is_nth_index_ordered_non_unique<MI,tag_to_n<MI,Tag>::value> {}; template <typename MI, typename Tag> struct is_tagged_index_ordered : is_nth_index_ordered<MI,tag_to_n<MI,Tag>::value> {}; template <typename MI, typename Tag> struct is_tagged_index_sequenced : is_nth_index_sequenced<MI,tag_to_n<MI,Tag>::value> {}; // // test with another example container: // struct as_set {}; struct as_list {}; typedef mi::multi_index_container< double, mi::indexed_by< mi::sequenced< mi::tag<as_list> >, mi::ordered_non_unique< mi::tag<as_set>, mi::identity<double> > > > double_set_2; void fun() { double_set_2 ds2; } BOOST_MPL_ASSERT(( is_nth_index_sequenced<double_set_2,0> )); BOOST_MPL_ASSERT(( is_nth_index_ordered<double_set_2,1> )); BOOST_MPL_ASSERT(( mpl::not_< is_nth_index_ordered<double_set_2,0> > )); BOOST_MPL_ASSERT(( mpl::not_< is_nth_index_sequenced<double_set_2,1> > )); BOOST_MPL_ASSERT(( is_tagged_index_sequenced<double_set_2,as_list> )); BOOST_MPL_ASSERT(( is_tagged_index_ordered<double_set_2,as_set> )); BOOST_MPL_ASSERT(( mpl::not_< is_tagged_index_ordered<double_set_2,as_list> > )); BOOST_MPL_ASSERT(( mpl::not_< is_tagged_index_sequenced<double_set_2,as_set> > ));

更多推荐

本文发布于:2023-07-29 20:35:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1319548.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:索引   类型   Boost   multi

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!