2013-10-23 50 views
1

所以我想獲得一個唯一的類型列表,我想擺脫所有常量重複,我通過列表可能會包含。我認爲下面的代碼應該可以工作,但my_set包含兩次「int」。我究竟做錯了什麼?boost :: mpl :: set認爲remove_cv <const T> :: type!= T

#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

如果從'升壓刪除':: type' :: remove_cv'它似乎工作。希望有人能夠告訴你爲什麼。 – llonesmiz

回答

2

是的,正如cv_and_he所說,這是因爲boost :: remove_cv :: type。

由於add :: type to 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> 
相關問題