Wbrew pozorom nie jest to takie proste zadanie, bo co bym nie zrobił to kompilator czepia się, że a to w funkcji constexpr daję std::cout czy czepia sie wskaźnika na tablicę:
main.cpp:43:5: error: modification of ‘tab’ is not a constant-expression
Podobnie z std::array<int, 10>.
Próbowałem różnych sposobów i nie wiem co tu zrobić by zapamiętać te 10 liczb pierwszych w czasie kompilacji. Ktoś wie może co w poniższym kodzie zmodyfikować?
#include <stdio.h>
#include <iostream>
#include <assert.h>
#include <array>
constexpr bool generateFibonacciNumbers(int n, int expectedNum, int currNum, int tab[10])
{
if(n < 2)
n = 2;
bool isDividerFound = false;
for(int i=2; i*i <= n; ++i)
{
if(n%i == 0)
{
isDividerFound = true;
break;
}
}
if(!isDividerFound)
{
tab[currNum] = n;
++currNum;
}
if(currNum == expectedNum)
return true;
return generateFibonacciNumbers(n+1, expectedNum, currNum, tab);
}
int main()
{
int tab[10];
static_assert(generateFibonacciNumbers(0,10,0,tab), ""); //jak tak dajesz i ci sie skompiluje to masz pewność, że w czasie kompilacji sie te liczby wygenerowały
std::cout << "First 10 numbers:" << std::endl;
for(int i=0; i<10; ++i)
std::cout << tab[i] << std::endl;
return 0;
}