提升 multi_index 获取依赖类型

Posted

技术标签:

【中文标题】提升 multi_index 获取依赖类型【英文标题】:boost multi_index get on dependent type [duplicate] 【发布时间】:2017-08-06 21:08:10 【问题描述】:

我遇到了一个问题,对于依赖类型,如果 C 是依赖类型,boost::multi_index::multi_index_container<...>::get<C>() 会中断。如果它不依赖,则不会发生同样的情况。 MCVE,g++ 7.1.0(如果你声明 is_same_v,也是 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】:

表明get是一个模板:

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

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

【讨论】:

以上是关于提升 multi_index 获取依赖类型的主要内容,如果未能解决你的问题,请参考以下文章

从提升的子进程获取错误和标准输出

提升结构和类的融合序列类型和名称识别

Golang依赖注入提升开发效率!

使 Yarn 不提升特定包的依赖项

部分依赖图和梯度提升(GBM 包)

在两个 Visual Studio 实例中使用签名依赖项,一个提升/管理员,一个普通