Из 14.7.1 (15):
Результат бесконечной рекурсии в экземпляре не определен.
Относительно вашего кода: вы не можете сделатьстатические условия с if
.Вместо этого вам понадобится какой-то функциональный подход и частичная специализация:
template <typename T, bool> struct run_function;
template <typename T> struct run_function<T, true>
{
static int go(T const & x) { return 0; }
};
template <typename T> struct run_function<T, false>
{
static int go(T const & x)
{ return 1 + run_function<T, true>::go(wrappit(x)); }
};
Теперь больше нет бесконечной рекурсии, потому что две ветви используют различных шаблонов , которые в конечном итоге не создаютсядругие шаблоны.