A variation on the theme:
exprToFunction[expr_, vars_] := Function[Evaluate[expr /. Thread[vars -> Array[Slot, Length[vars]]]]]
If you didn't insist on pure functions, you could get away with
exprToFunction[expr_, vars_] := Function[vars, expr]
You can avoid ToExpression and ToString by :
exprToFunction[expr, vars] := Function @ expr /. MapIndexed[#1 -> Slot @@ #2 &, vars]