Use trait struct like here: Using a nested name specifier in CRTP
#include <iostream>
template <typename TDerived>
struct traits;
template <typename TDerived>
struct Base
{
int array[traits<TDerived>::NValue];
};
template <int N>
struct Derived : Base<Derived<N>>
{};
template <int N>
struct traits<Derived<N>> {
constexpr static int NValue = N;
};
int main()
{
Derived<8> derived;
Base<decltype(derived)>& b = derived;
std::cout << sizeof(b.array);
}