C++ 从mpl折叠表达式检索迭代器位置

C++ 从mpl折叠表达式检索迭代器位置,c++,templates,c++11,variadic-templates,boost-mpl,C++,Templates,C++11,Variadic Templates,Boost Mpl,如何使用boost::mpl获取以下折叠类型的索引,它是某种mpl::set,但不完全是。值iter::pos::value不知何故没有定义 using unique_types = typename mpl::fold< mpl::vector<int,double,float,float,float> , mpl::set0<> , mpl::insert<mp

如何使用boost::mpl获取以下折叠类型的索引,它是某种mpl::set,但不完全是。值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!
在线编译:

虽然边缘类型是一个mpl::vector,但唯一的边缘类型取决于mpl::set的实现细节,而mpl::find不适用于mpl::set。类似的错误发生在

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:

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
#include <boost/mpl/unique.hpp>
#include <boost/type_traits/is_same.hpp>

using unique_types = mpl::unique<types, boost::is_same<_1,_2>>::type;