Multiple dispatch is actually really well suited for this. The idiomatic approach in Julia is quite similar to your c++ example, at least conceptually:
immutable Foo end immutable Bar end alg(::Type{Foo}) = println("I'm using foo") alg(::Type{Bar}) = println("I'm using bar") strategy = Foo # or Bar alg(strategy) // T