Alternate operator_traits with slightly different semantics from boost