Как ограничить допустимые типы при описании шаблона типа в C++?
Начиная с C++17, можно использовать constexpr if в шаблонах: en.cppreference.com/w/cpp/language/if . В самом условии что-то вроде en.cppreference.com/w/cpp/types/is_same, ну и выдавать ошибку компиляции, если типы не соотвествуют. Правда правила вам всё равно руками придётся прописывать или почитать advanced template metaprogramming.
Есть ещё вариант c boost::mpl, например использовать mpl::vector.
Вариант, который предложил Adamos в комментариях, для меня оказался именно тем, что я искал. По крайней мере удалось реализовать задуманное