Rust macros are executed before the types are analyzed, so you won't be able to know the types of expressions. Macros operate on tokens of the syntax. In this way they're closer to the C preprocessor.
Rust's closest analogy of C++ templates is traits/generics.
In practice you'd probably end up using both: macros to give it nice syntax, and generics under the hood to execute type-specific operations.