我对引用标准中的具体段落的答案感兴趣,而不仅仅是一般意见。
template <class T> struct wrapped
{
wrapped(const T&) {}
};
template <class T> wrapped<T> wrappit(const T& x)
{
return wrapped<T>(x);
}
template <class T> int run_function(const T& x, bool wrapped)
{
if (wrapped) {
return 0;
} else {
return run_function(wrappit(x), true) + 1;
}
}
int main()
{
const int result = run_function(0.5, false);
return result;
}
答案 0 :(得分:5)
符合要求的实施可能会拒绝此代码。见标准的附录B.
您的实施应包含其文档中的某些限制,其中包括:
答案 1 :(得分:4)
从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)); }
};
现在没有更多的无限递归,因为这两个分支使用不同的模板,最终不会实例化其他模板。