Возможна ли идея шаблона <int ...> в C++?

Я пытаюсь научиться реализовывать templateв C++. Когда я меняю свой код NTT (Теоретико-числовое преобразование) на код, использующийtemplate, который выглядит так:

template <long long mod> struct NTT{
    int x = 0;
    NTT(){
        long long p = mod-1;
        while(!(p % 2)){
            p >>= 1;
            ++x;
        }       
    }   
    const static long long root_pw = 1 << x;
//(there is a function after this that also needs to read the value 'root_pw')
};

signed main()
{
    NTT<998244353> ntt1;
    vector<long long> a(ntt1::root_pw,0);
}

Он говорит мне сделать x static.

Когда я это делаю, он говорит мне сделать x const, что в первую очередь устраняет причину, по которой x здесь находится.

Я использую (GNU C++11) и мой компилятор (Dev-C++ 5.11), настроенный для настройки (64-разрядная версия TDM-GCC 4.9.2), если это помогает.

Я действительно хочу, чтобы это сработало, но не знаю как.

Это, наверное, глупо легко, но чего мне не хватает?

Заранее спасибо.

1 ответ

Решение

Вы можете заменить функцию C++14

template <long long mod>
constexpr int f()
{
    int x = 0;
    long long p = mod-1;
    while(!(p % 2)){
        p >>= 1;
        ++x;
    }       
    return x;
}

по версии C++11:

template <long long p>
constexpr int f2()
{
    return p % 2 ? 0 : 1 + f2<p / 2>();
}

template <long long mod>
constexpr int f()
{
    return f2<mod - 1>();
}

Так что

template <long long mod>
struct NTT{
    constexpr static const long long root_pw = 1LL << f<mod>();

};

Демо

Другие вопросы по тегам