我正在尝试推断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>
,但是我认为结果更糟。如何解决此问题?请给予我一些提示或关键词。
1条答案
按热度按时间ivqmmu1c1#
您的别名应为:
Demo