Not quite, given that C++ templates do higher-level type-checking than just expanding and checking.
Also, they support higher-order kinds (a template parameterized by a template). And specialization (specifying special cases). And automatic instantiation based on the static types at the call site. Etc.