简介
property在boost.graph中有使用,用于表示点属性或者边属性
结构
property
其支持属性的嵌套,通过模板参数Base
template <class Tag, class T, class Base = no_property>struct property {typedef Base next_type;typedef Tag tag_type;typedef T value_type;property(const T& v = T()) : m_value(v) { }property(const T& v, const Base& b) : m_value(v), m_base(b) { }// copy constructor and assignment operator will be generated by compilerT m_value;Base m_base;};
lookup_one_property
其用于查找属性列表中属性为tag的值。
T
:表示属性集合,与lookup_one_property_internal
的模板参数PList
一致
Tag
:表示属性,与lookup_one_property_internal
的模板参数PropName
一致
lookup_one_property_internal
的模板定义为
template <typename T, typename Tag>
struct lookup_one_property: lookup_one_property_internal<T, Tag> {};template <typename PList, typename PropName, typename Enable = void>
struct lookup_one_property_internal
{BOOST_STATIC_CONSTANT(bool, found = false); typedef void type;
};
针对PList
类型为property
并且PropName
类型与property
的第一个模板参数类型一致时的模板特例化为如下,其增加了lookup
方法,返回property
中的m_value
引用
template <typename Tag, typename T, typename Base>
struct lookup_one_property_internal<boost::property<Tag, T, Base>, Tag>
{BOOST_STATIC_CONSTANT(bool, found = true);typedef property<Tag, T, Base> prop;typedef T type;template <typename U>static typename enable_if<is_same<prop, U>, T&>::typelookup(U& prop, const Tag&) {return prop.m_value;}template <typename U>static typename enable_if<is_same<prop, U>, const T&>::typelookup(const U& prop, const Tag&) {return prop.m_value;}
};
针对PList
类型为property
并且PropName
类型与property
的第一个模板参数类型不一致时的模板特例化为如下,其会查找base_type的tag属性对应的值
template <typename Tag, typename T, typename Base, typename PropName>
struct lookup_one_property_internal<boost::property<Tag, T, Base>, PropName>: lookup_one_property_internal<Base, PropName>
{private:typedef lookup_one_property_internal<Base, PropName> base_type;public:template <typename PL>static typename lazy_enable_if<is_same<PL, boost::property<Tag, T, Base> >,add_reference<typename base_type::type> >::typelookup(PL& prop, const PropName& tag) {return base_type::lookup(prop.m_base, tag);}template <typename PL>static typename lazy_enable_if<is_same<PL, boost::property<Tag, T, Base> >,add_reference<const typename base_type::type> >::typelookup(const PL& prop, const PropName& tag) {return base_type::lookup(prop.m_base, tag);}
};
get_property_value
属性查找模板函数,返回属性对应的值引用
template <class PropertyList, class Tag>
inline typename lookup_one_property<PropertyList, Tag>::type&
get_property_value(PropertyList& p, Tag tag)
{return lookup_one_property<PropertyList, Tag>::lookup(p, tag);
}template <class PropertyList, class Tag>
inline const typename lookup_one_property<PropertyList, Tag>::type&
get_property_value(const PropertyList& p, Tag tag)
{return lookup_one_property<PropertyList, Tag>::lookup(p, tag);
}