I use a special weight_map (cost functions of my own), providing my own distance_combine. So WeightMap::value_type is CostFunction
I think that your WeightMap should return the result of your CostFunction, not the function itself. I'm not familiar with the graph library, though, so I don't know if that's easy to do.
The dijkstra algorithm checks if an edge has a positive weight (boost/graph/dijkstra_shortest_paths.hpp lines 121 & 122 with version 1.36.0). .... For now I just commented out the check
Dijkstra's algorithm only works correctly with non-negative edge weights, so some sort of check is necessary.
PS: a more general optimality condition is (sufficient, but I'm not sure if it's necessary) : the combine function has to be non decreasing : for a node u, and edge e = (u,v), the distance_map d and the weight map w distance_compare(d[u], distance_combine(d[u], w[e]) ) has to be true
This should be sufficient in general, and again, some sort of check is necessary.