Suppose you want to read in a .dot graph into boost where there could be properties you do not recognize. It is easy to ignore them (by passing ignore_other_properties to the dynamic_properties constructor) but what if you wanted all the properties added to dynamic_properties instead?
The below code demonstrates the problem. The handle_custom_properties is a copy of ignore_other_properties and the code will compile / run, reporting "3 vertices, 2 edges." What needs to be added to handle_custom_properties so that, on return, dp will contain a property "label" and node A will have value "x" for the label property?
#include <iostream>
#include <string>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/exception/exception.hpp>
#include <boost/exception/diagnostic_information.hpp>
struct vertex_p {
    std::string node_id;
};
typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS, vertex_p> graph_t;
boost::shared_ptr<boost::dynamic_property_map>
handle_custom_properties(const std::string& s,
    const boost::any& k,
    const boost::any& v) {
    // What goes in here to add dynamic property map for property "s" which key-value pair <k,v>?
    // What ignore_other_properties does
    return boost::shared_ptr<boost::dynamic_property_map>();
}
int main() {
    std::string str(R"(graph {
    A [ label="x" ]
    B
    C
    A -- B
    A -- C
}
)");
    try {
        graph_t g;
        boost::dynamic_properties dp{handle_custom_properties};
        dp.property("node_id", get(&vertex_p::node_id, g));
        if (boost::read_graphviz(str, g, dp)) {
            std::cout << "read_graphviz returned success" << std::endl;
            std::cout << "graph stats:" << std::endl;
            std::cout << "  " << g.m_vertices.size() << " vertices" << std::endl;
            std::cout << "  " << g.m_edges.size() << " edges" << std::endl;
        }
        else {
            std::cout << "read_graphviz returned failure" << std::endl;
        }
    }
    catch (std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
    catch (boost::exception& e) {
        std::cerr << boost::diagnostic_information(e) << std::endl;
    }
}