提升 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 获取依赖类型的主要内容,如果未能解决你的问题,请参考以下文章