This example works well for raw data but not for complex types. You could make the filter a template, taking the key and a "hasher" function as template args.
I don't use c++ so I'm not sure how std:hash works or gets implemented, but the way that guava (Google's java library) does it is by passing in a key and a funnel object. The funnel object is essentially responsible for decomposing the object into a byte stream. The advantage of doing it this way rather than making the caller specify his own hash is that you can use murmurhash3 which you thought had the best properties for the bloom filter.
This proposal decouples the implementation of hash functions from how types get hashed.
[1] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n398...