简介
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 compiler
T 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&>::type
lookup(U& prop, const Tag&)
{
return prop.m_value;
}
template <typename U>
static typename enable_if<is_same<prop, U>, const T&>::type
lookup(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> >::type
lookup(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> >::type
lookup(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);
}