提升multi_index获取依赖类型

时间:2017-08-06 21:08:11

标签: c++ templates boost

我遇到了一个问题,对于依赖类型,如果boost::multi_index::multi_index_container<...>::get<C>()是依赖类型,则C会中断。如果它不依赖,则不会发生同样的情况。 MCVE,g ++ 7.1.0(如果声明is_same_v&lt;&gt;也是6.3.0):

#include <type_traits>                                                                                             
#include <boost/multi_index_container.hpp>                                                                         
#include <boost/multi_index/ordered_index.hpp>                                                                     
#include <boost/multi_index/identity.hpp>                                                                          
#include <boost/multi_index/member.hpp>                                                                            
#include <boost/multi_index/mem_fun.hpp>                                                                           
#include <boost/multi_index/random_access_index.hpp>                                                               

#define MEMBER(T, M)        boost::multi_index::member<T, decltype(T::M), &T::M>                                   
#define TAGNMEMBER(T, M)    boost::multi_index::tag<MEMBER(T, M)>, MEMBER(T, M)                                    

namespace ns1 {                                                                                                    
    struct Elem {                                                                                                  
        size_t id_;                                                                                                

        bool operator<(const Elem& rhs) const { return id_ < rhs.id_; }                                            
    };                                                                                                             

    using Cont = boost::multi_index::multi_index_container<                                                        
        Elem,                                                                                                      
        boost::multi_index::indexed_by<                                                                            
            boost::multi_index::ordered_unique<boost::multi_index::identity<Elem>>,                                
            boost::multi_index::ordered_unique<TAGNMEMBER(Elem, id_)>                                              
        >                                                                                                          
    >;                                                                                                             
}                                                                                                                  

namespace ns2 {                                                                                                    
//    void f(ns1::Cont& cont) // always works                                                                      
    template<typename C>                                                                                           
    void f(C& cont)                                                                                                
    {                                                                                                              
        ns1::Cont& c = cont;                                                                                       
        static_assert(std::is_same_v<decltype(cont), ns1::Cont&>);                                                 
        cont.get<MEMBER(ns1::Elem, id_)>(); // v1 - error if dependent type                                        
        //c.get<MEMBER(ns1::Elem, id_)>();  // v2 - always works                                                   
    }                                                                                                              
}                                                                                                                  


int main()                                                                                                         
{                                                                                                                  
    ns1::Cont cont;                                                                                                
    cont.insert({0});                                                                                              
    ns2::f(cont);                                                                                                  
}

你能告诉我吗?

1 个答案:

答案 0 :(得分:2)

表明get是模板:

cont.template get<MEMBER(ns1::Elem, id_)>(); // now works

它适用于c,因为您明确声明了它的类型(ns1::Cont),因此,get不再依赖。