Here are some templates which you can use to convert multidimensional array type to your Tensor type.
#include <type_traits> #include <utility> template <typename T, std::size_t N> struct prepend_index_sequence; template <std::size_t N, std::size_t... Ms> struct prepend_index_sequence<std::index_sequence<Ms...>, N> { using type = std::index_sequence<N, Ms...>; }; template <typename T, std::size_t N> using prepend_index_sequence_t = typename prepend_index_sequence<T, N>::type; template <typename T> struct mdarray_traits { using value_type = T; using dimentions = std::index_sequence<>; }; template <typename T, std::size_t N> struct mdarray_traits<T[N]> { using value_type = typename mdarray_traits<T>::value_type; using dimentions = prepend_index_sequence_t<typename mdarray_traits<T>::dimentions, N>; }; template <template <typename T, std::size_t...> typename ApplyOn, typename T, typename Dim> struct apply_array_traits_on_helper; template <template <typename, std::size_t...> typename ApplyOn, typename T, std::size_t... Dim> struct apply_array_traits_on_helper<ApplyOn, T, std::index_sequence<Dim...>> { using type = ApplyOn<T, Dim...>; }; template <template <typename T, std::size_t...> typename ApplyOn, typename ArrT> using apply_array_traits_on_t = typename apply_array_traits_on_helper< ApplyOn, typename mdarray_traits<ArrT>::value_type, typename mdarray_traits<ArrT>::dimentions>::type;
Here is code covered with tests (using static asserts).
You can use this to create template deduction guide for your tensor. It will go more or less like this:
template<class T> Tensor(T arr) -> apply_array_traits_on_t<Tensor, T>;
But probably you need to create some concepts to limit this template to arrays only to avoid conflicts with other overloads.
Tensor(const T &) -> SomeTemplate<T>;, whereSomeTemplatewould expand would analyzeT(recursively) and return the correct tensor.std::mdspan.