fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. template<int X> int const num = X==1 ? 0 : 1 + num<X%2 ? X*3+1 : X/2>;
  5. //template<int X> int const ccc = X==0 ? 0 : 1 + ccc<0>; // ошибка: константа ccc<0> явно определена через саму себя
  6. template<int X> int const rec = X==0 ? 0 : 1 + rec<(X ? 0 : 0)>; // поэтому прибегнем к трюку, сделаем вид, что параметр вычисляется
  7. template<int X> int const err = X==0 ? 0 : 1 + err<(X ? X : X)>;
  8.  
  9. template<int X> int constexpr eee = X==0 ? 0 : 1 + eee<(X ? X : X)>;
  10. template<int X> int const inf = X==0 ? 0 : 1+inf<X-1>;
  11.  
  12. int n[num<27>];
  13. int r[rec<10>];
  14. //int e[err<10>]; // это не константа времени компиляции, а статическая переменная
  15. //int e[eee<10>]; //
  16.  
  17. int main() {
  18. cout << num<27> << endl; // 111
  19. cout << rec<10> << endl; // 1 - честно вычислил рекурсию
  20. cout << err<10> << endl; // 1 - особенности инициализации статической переменной
  21. //cout << eee<10> << endl; // ошибка: зацикливание в constexpr
  22. //cout << inf<10> << endl; // ошибка: исчерпание глубины рекурсии, inf<-899>
  23. }
  24.  
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
111
1
1