У меня есть код как
template <size_t N>
class A
{
template <size_t N>
someFunctions() {};
};
Теперь я хочу создать экземпляры класса и вызвать его функции в цикле for для множества значений:
// in main()
int main()
{
for (int i = 1; i <= 100; i++)
{
const int N = i; // dont know how to do this
A<N> a;
a.functionCalls();
}
}
Как это сделать? Надеясь на метод, чтобы сделать это.
c++
for-loop
templates
compile-time-constant
template-classes
Начиаппан Венкатеш
источник
источник
N
необходимоconstexpr
если это переменная цикла, это не такОтветы:
Для этого потребуется нечто, называемое a,
template for
которое будут принимать ожидаемые операторы раскрытия формы , что выглядит как цикл for, но в действительности это шаблонный блок в функции, которая создается несколько раз.Конечно, есть обходной путь. Мы можем использовать общие лямбды, чтобы объявить какой-то локальный шаблонный блок и создать его сами:
Эта функция принимает целочисленную последовательность и создает лямбду
F
столько раз, сколько длина последовательности.Используется так:
Здесь
N
можно отправить как параметр шаблона, потому что это объект, у которого есть оператор преобразования constexpr в целочисленный тип. Точнее, этоstd::integral_constant
с возрастающей ценностью.Живой пример
источник
static_cast<void>
?f
возвращает тип, который перегружает оператор запятойtemplate for
. Злоупотребление такими языковыми конструкциями всегда более болезненноN
потребности быть постоянными во время компиляции, который с нормальнымfor
цикл не представляется возможным.Но есть много обходных путей. Например, вдохновленный этим SO сообщением , вы можете сделать что-то вроде следующего. ( См. Живую демоверсию )
Печать
1
в100
В c ++ 17 вышеприведенное может быть сведено к одному шаблонному
AGenerator
классу (то есть можно избежать специализации), используяif constexpr
. ( См. Живую демонстрацию )Выход :
В случае предоставления диапазона итерации, вы можете использовать следующее. ( См. Живую демонстрацию )
Выходы такие же, как в вышеприведенной версии.
источник
Начиная с C ++ 20, вы можете использовать лямбды-шаблоны, поэтому вы можете попробовать что-то вроде следующего
Ниже приведен полный пример компиляции, который печатает все числа от 0 до 99
источник
Один из способов сделать это - шаблонное метапрограммирование с чем-то вроде этого:
источник
Просто для полноты - действительно ли требуется, чтобы класс или функция были шаблонными, если единственное использование функции вызывается из цикла?
Если это так, и вы не хотите писать от руки, взгляните на boost.hana.
источник