Возможна ли идея шаблона <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>();
};