Я новичок в c ++. Может кто-нибудь объяснить простым способом?
Я собираюсь попробовать, но это шаблонное метапрограммирование, которое обычно требует некоторого опыта в сочетании с функциональным стилем (что является еще одной областью знаний).
- template stati c void step (const Action & action) является шаблоном функции?
Да, функция, в которой Action
является параметр.
что такое действие (std :: integra_constant ()) ;? Я думал, что действие передается по ссылке. Тем не менее, я не совсем понимаю.
Общая идея unroller
состоит в том, чтобы развернуть все oop. Это позволяет автоматически генерировать последовательность вызовов чего-то вроде:
action(0);
action(1);
action(2);
...
action(NUM_ROWS-1);
action
- это параметр для любой функции, которая может получить значение int
. Используемая здесь функция:
[&input_idx, input_accessor](auto i_idx) {
constexpr int i = i_idx.value;
unroller<0, NUM_COLS>::step([&input_idx, input_accessor](auto j_idx) {
constexpr int j = j_idx.value;
ProducerToConsumerPipeMatrix::pipe_at<i,j>::write(input_accessor[input_idx++]);
}
}
, которая сама использует развертывание! Похоже, это разворачивает вычисления на двухмерных матричных элементах. Эти функции называются лямбда-выражениями, анонимные функции вы предпочитаете. Тогда вы находитесь в сфере функционального программирования.
Я не понимаю, как это вызывает unroller<0, NUM_ROWS>::step([&input_idx, input_accessor](autoi_idx)
. Насколько я понимаю, в угловых скобках <> должны быть типы данных. В этом случае это передать значение. Кроме того, что такое :: шаг? Тогда, почему он может передавать 2 аргумента в шаге (...)>
Параметры шаблона могут быть типами, но также могут быть значения различного вида ... unroller
является типом шаблона это принимает два аргумента: <int It, int End>
. It
и End
набираются как int
s, а не class
или typename
(как это имеет место с Action
).