#include <array>
#include <iostream>

class FacTableEntry {
    public:
        constexpr FacTableEntry (unsigned int n) : m_num (n), m_fac (faculty (n)) {}
        
        static constexpr unsigned int faculty (unsigned int n) {
            return n == 1 ? 1 : faculty (n-1)*n;
        }
        
        unsigned int m_num, m_fac;
};

template <unsigned int N>
class FacTable {
    public:
        constexpr FacTable (std::array<FacTableEntry,N> entries) : m_data (entries) {}
        
        std::array<FacTableEntry,N> m_data;
};

constexpr const FacTable<5> myFacTable {{{{1}, {2}, {5}, {7}, {15}}}};

int main () {
    for (auto& entry : myFacTable.m_data)
        std::cout << "fac(" << entry.m_num << ")=" << entry.m_fac << std::endl;
}