Classes like Csr
have a fixed set of allowed template arguments, we should static_assert them with something like
template <typename T>
struct is_supported_value_type : std::false_type {};
template <>
struct is_supported_value_type<double> : std::true_type {};
etc.