Параметры шаблона для многомерного массива С++

Может ли кто-нибудь объяснить, как создается экземпляр следующего базового шаблона и специализации для получения правильного результата? Мне особенно неясно, как интерпретируется параметр шаблона <U[N]>. Это потому, что параметр шаблона, не относящийся к типу, рекурсивно ссылается на последнее/внешнее измерение?

Я видел этот вопрос, связанный с шаблонами, на который мне указали как на похожий, но он не касается метафункций шаблонов, многомерных массивов или рекурсии.

//The primary template handles scalar (non-array) types as a base case
template <class T> 
struct rank { static size_t const value = 0U; };

//The partial specialization recognizes an array type:
template <class U, size_t N>
struct rank<U[N]> {
    static size_t const value = 1u + rank<U>::value;
};

int main() {
  using array_t = int[10][20][30];
  //yields 3u (at compile time)
  std::cout << "rank is " << rank<array_t>::value << std::endl;
}

Этот код взят из этого видео на YouTube о метапрограммировании шаблонов.

Для типа int[10][20][30]U становится int[10][20], а N становится последним 30. Для следующей «рекурсии» U — это int[10], а N — это 20. Тогда U — это int, который использует базовую структуру для «возврата» 0. Итак, по сути, у вас есть rank<int[10][20][30]>::value (из функции main, rank<int[10][20]>::value, rank<int[10]>::value и, наконец, rank<int>::value.

Some programmer dude 20.07.2024 00:50

он рекурсивно создает экземпляр специализированного шаблона, отслаивая по одному экстенту за раз, пока он не перестанет быть массивом и первичный шаблон не даст значение 0.

Gene 20.07.2024 00:58

«Этот код взят из этого видео на YouTube…» Я бы рекомендовал для этого использовать cppinsights . Также книга по C++ . И Можем ли мы увидеть шаблоны, созданные компилятором C++? где в этом ответе упоминается cppinsight.

user12002570 20.07.2024 06:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Они создаются:

struct rank<int> { static size_t const value = 0U; };

struct rank<int[10]> {
    static size_t const value = 1u + rank<int>::value;
};

struct rank<int[10][20]> {
    static size_t const value = 1u + rank<int[10]>::value;
};

struct rank<int[10][20][30]> {
    static size_t const value = 1u + rank<int[10][20]>::value;
};

int main() {
  using array_t = int[10][20][30];
  //yields 3u (at compile time)
  std::cout << "rank is " << rank<array_t>::value << std::endl;
}

Спасибо. Это очень наглядно помогает понять, что делает компилятор. Я предполагаю, что часть моего недоразумения была связана с тем, как C++ преобразует аргумент шаблона, не относящийся к типу, в массив с меньшим количеством измерений на каждой итерации. (Мне также напомнили попробовать cppinsights для... понимания.)

Rich Ramos 20.07.2024 14:32

Другие вопросы по теме