On Thu, 19 Mar 2009, Andrew Sutton wrote:
(snip)
Unfortunately, I don't think such a function actually exists. However, if you can detect these at compile time, you can
easily reflect that as a runtime query:
template
bool has_property(Graph const& g)
{ return has_property_metafunc::value; }
It appears that the value_type of an undefined non-bundled property map is
always boost::detail::error_property_not_found, so you can use the
following metafunction to detect them:
#include
#include
#include
#include
template
struct graph_has_property: public
boost::mpl::not_<
boost::is_same<
typename boost::property_traits<
typename boost::property_map::type
>::value_type,
boost::detail::error_property_not_found
>
>
{};
This always returns true when given a bundled property, however (it does
work for testing for non-bundled properties in graphs that have bundled
properties). I have not figured out how to test for bundled properties;
there is a compile error when trying to get a particular value from a
nonexistent member of a bundled property map. Is that a case that is
important to you? There are several Boost graph algorithms that make a
decision based on whether a property exists; look for the handling of the
color map at the bottom of boost/graph/breadth_first_search.hpp for an
example (look at the definition of boost::detail::bfs_dispatch). The code
there is a more complicated version of the metafunction above, but can
also handle an optionally user-specified color map.
-- Jeremiah Willcock