why change from `struct` to `template`?