从mpl-fold表达式中检索迭代器位置

Retrieve iterator position from mpl fold expression

本文关键字:迭代器 位置 检索 mpl-fold 表达式      更新时间:2023-10-16

如何使用boost::mpl(它是某种mpl::set,但不完全是)获得以下折叠类型的索引。value iter::pos::value不知何故没有定义??

using unique_types =
            typename mpl::fold<
            mpl::vector<int,double,float,float,float>
            , mpl::set0<>
            , mpl::insert<mpl::placeholders::_1, mpl::placeholders::_2> /** _1 = State = set<...>, _2 element of NodeTypes*/
            >::type;
        using iter =  typename boost::mpl::find< unique_types , int>::type;
std::cout << iter::pos::value << std::endl;  // <<<< Not defined!

在线编译:Coliru

using types = mpl::vector<int, double, float, float, float>
using unique_types<types, mpl::set0<>, mpl::insert<_1, _2>>::type;
using iter = mpl::find<unique_edge_types, int>::type;
// std::cout << iter::pos::value << std::endl;
// error: 'boost::mpl::iter<boost::mpl::s_item<...a lot of text... > >::pos'
//        has not been declared (mpl::s_item is a piece of mpl::set implementation)

虽然edge_typesmpl::vector,但unique_edge_types[/strong>是(根据实现详细信息)mpl::set并且mpl::find不适用于mpl:。也出现类似错误

using unique_types = mpl::set<int, double, float>;
using iter = mpl::find<unique_types, int>::type;
// std::cout << iter::pos::value << std::endl;
// error: 'boost::mpl::iter<boost::mpl::set<...a lot of text... > >::pos'
//        has not been declared

您可以使用标准函数mpl::unique返回mpl::vector:

#include <boost/mpl/unique.hpp>
#include <boost/type_traits/is_same.hpp>
using unique_types = mpl::unique<types, boost::is_same<_1,_2>>::type;