Я пытаюсь написать функцию, которая заставляет constexpr
вычислять через. шаблон. Я написал это, но это работает только для int
(будьте осторожны, ошибки с глубиной рекурсии при G CC):
#include <iostream>
template<int val>
constexpr int force_constexpr() { return val; }
constexpr int triangle(int n)
{
return n ? n + triangle(n - 1) : 0;
}
int main(void)
{
std::cout << force_constexpr<triangle(0x200)>() << '\n';
}
Обратите внимание, что это только для демонстрационных целей; Я знаю, что номер треугольника можно вычислить с помощью (n+1)*n/2
.
Затем я попытался написать обобщенную функцию c, которая, однако, не работает. Это простая ошибка (не удивительно, поскольку она использует T
до определения T
):
template<T val, typename T = decltype(val)>
constexpr T force_constexpr() { return val; }
как есть (что, очевидно, не будет работать; это вложенный шаблон):
template<typename T>
template<T val>
constexpr T force_constexpr() { return val; }
и для этого требуется тип передаваемого аргумента:
template<typename T, T val>
constexpr T force_constexpr() { return val; }
Как это сделать, не передавая тип в качестве параметра в шаблон? Или, другими словами, как я могу определить тип параметра шаблона?
Я ищу решение C ++ 11, но приветствуются решения для других стандартов.