所以我试图获得一个唯一的类型列表,我想摆脱我传递的列表可能包含的所有const重复项。我认为以下代码应该可以工作,但是my_set包含两次“int”。我做错了什么?
#include <boost/mpl/vector.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/type_traits/remove_cv.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/set.hpp>
#include <boost/mpl/insert.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/assert.hpp>
typedef boost::mpl::vector<float,int,float,const int>::type my_v;
typedef boost::mpl::transform
< my_v
, boost::remove_cv<boost::mpl::_1>::type
>::type my_v2;
typedef boost::mpl::fold
< my_v2
, boost::mpl::set0<>
, boost::mpl::insert
< boost::mpl::_1
, boost::mpl::_2
>
>::type my_set;
BOOST_MPL_ASSERT_RELATION( boost::mpl::size<my_set>::value, ==, 2 ); // Fails
答案 0 :(得分:2)
是的,因为cv_and_he说,这是因为boost :: remove_cv :: type。
将boost :: type添加到boost :: remove_cv将强制对表达式求值,并使remove_cv计算_1表达式本身但不计算基础参数。 这里transform是一个递归函数,所以我们应该删除':: type',以便在整个变换表达式扩展后允许对参数进行惰性求值。
见下面的测试结果,
#include <boost/mpl/vector.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/type_traits/remove_cv.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/set.hpp>
#include <boost/mpl/insert.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/assert.hpp>
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
typedef boost::mpl::vector<float,int,float,const int>::type my_v;
typedef boost::mpl::transform<my_v,
boost::remove_cv<boost::mpl::_1>::type
>::type my_v2;
typedef boost::mpl::fold< my_v2,
boost::mpl::set0<>,
boost::mpl::insert<boost::mpl::_1,
boost::mpl::_2
>
>::type my_set;
// BOOST_MPL_ASSERT_RELATION( boost::mpl::size<my_set>::value, ==, 2 ); // Fails
int main()
{
int status;
std::cout << abi::__cxa_demangle(typeid(boost::remove_cv<boost::mpl::_1>::type).name(), 0, 0, &status)
<< '\n'
<< abi::__cxa_demangle(typeid(boost::remove_cv<boost::mpl::_1>).name(), 0, 0, &status)
<< '\n'
<< abi::__cxa_demangle(typeid(my_v2).name(), 0, 0, &status)
<< std::endl;
}
输出,
mpl_::arg<1>
boost::remove_cv<mpl_::arg<1> >
boost::mpl::v_item<int const, boost::mpl::v_item<float, boost::mpl::v_item<int, boost::mpl::v_item<float, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>