c++ 模板的用法-模板结构声明

kx7yvsdv  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在尝试推断std::array容器的基本类型。实验实现如下。

//  A recursive_array_unwrap_type Struct Implementation in C++

#include <algorithm>
#include <array>
#include <cassert>
#include <concepts>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ranges>
#include <stdexcept>
#include <string>
#include <type_traits>
#include <utility>

//  recursive_array_unwrap_type struct implementation
template<std::size_t, typename>
struct recursive_array_unwrap_type { };

template<template<class, std::size_t> class Container,
              typename T,
              std::size_t N>
struct recursive_array_unwrap_type<1, Container<T, N>>
{
    using type = std::ranges::range_value_t<Container<T, N>>;
};

template<std::size_t unwrap_level, template<class, std::size_t> class Container,
              typename T,
              std::size_t N>
requires (  std::ranges::input_range<Container<T, N>> &&
            requires { typename recursive_array_unwrap_type<
                                    unwrap_level - 1,
                                    std::ranges::range_value_t<Container<T, N>>>::type; })                //  The rest arguments are ranges
struct recursive_array_unwrap_type<unwrap_level, Container<T, N>>
{
    using type = typename recursive_array_unwrap_type<
        unwrap_level - 1,
        std::ranges::range_value_t<Container<T, N>>
        >::type;
};

template<std::size_t unwrap_level, template<class, std::size_t> class Container,
              typename T,
              std::size_t N>
using recursive_array_unwrap_type_t = typename recursive_array_unwrap_type<unwrap_level, Container<T, N>>::type;

int main()
{
    auto test_array = std::array<double, 5>{1, 2, 3, 4, 5};

    recursive_array_unwrap_type_t<1, decltype(test_array)> a;   //  <- error: template argument for template template parameter must be a class template or type alias template
    std::ranges::range_value_t<decltype(test_array)> b;         //  the type of a and the type of b should be the same
    std::cout << typeid(test_array).name();
    return 0;
}

godbolt link
但是,发生了错误error: template argument for template template parameter must be a class template or type alias template。我怀疑这个问题与recursive_array_unwrap_type结构声明有关,特别是在第17行template<std::size_t, typename>。我尝试过其他的东西,比如template<std::size_t, template<class, std::size_t> class, typename, std::size_t>或者只是template<std::size_t, template<class, std::size_t> class>,但是我认为结果更糟。如何解决此问题?请给予我一些提示或关键词。

ivqmmu1c

ivqmmu1c1#

您的别名应为:

template<std::size_t unwrap_level, class Container>
using recursive_array_unwrap_type_t = typename recursive_array_unwrap_type<unwrap_level, Container>::type;

Demo

相关问题