我有以下功能:
template<unsigned fromLine, unsigned toLine = fromLine>
void stateChanged()
{
// onStateChangeHandler[fromLine]();
if (fromLine < toLine)
stateChanged<fromLine + 1, toLine>();
}
我是这样调用它的:
stateChanged<0>();
stateChanged<1>();
stateChanged<2>();
stateChanged<3>();
stateChanged<4>();
stateChanged<5, 9>();
stateChanged<10, 15>();
我收到 fatal error :模板实例化深度超过最大值 900。 我假设在 C++14 中 if 条件会自动停止它。那么,如何正确地做到这一点呢?
最佳答案
使用 if constexpr
而不是 if
将防止此代码无限重复。
随着您现在编写的代码,stateChanged
的每个 实例化都会请求 stateChanged
的不同实例化。
before [编译器资源管理器]
after [编译器资源管理器]
template<unsigned fromLine, unsigned toLine = fromLine>
void stateChanged()
{
// onStateChangeHandler[fromLine]();
if constexpr(fromLine < toLine)
{
// If the above expression is false, this code is not compiled.
stateChanged<fromLine + 1, toLine>();
}
}
更新:
在 C++14 上,使用一些 SFINAE 可以产生相同的效果。
template<unsigned fromLine, unsigned toLine = fromLine,
typename std::enable_if_t< fromLine>=toLine >* = nullptr >
void stateChanged()
{
// onStateChangeHandler[fromLine]();
}
template<unsigned fromLine, unsigned toLine = fromLine,
typename std::enable_if_t< fromLine<toLine >* = nullptr >
void stateChanged()
{
// onStateChangeHandler[fromLine]();
stateChanged<fromLine + 1, toLine>();
}
C++14 after [编译器资源管理器]
关于c++ - 模板实例化深度超过最大值 - 如何停止特定情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66605706/