c++ - 模板实例化深度超过最大值 - 如何停止特定情况?

标签 c++ templates c++14

我有以下功能:

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/

相关文章:

php - 哪些模板语言适用于 JS 和 PHP?

c++ - 在 C++ 中为泛型实现线性探测

c++ - 模板类的虚函数是隐式实例化的吗?

c++ - 在 C++14 中使用 auto 作为返回和参数类型

c++ - -fno-inline 和编译时间

python - C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中没有

c++ - WICConvertBitmapSource BGR 到 Gray 意外像素格式转换

c++ - 覆盖函数的异常规范比基础版本更宽松

c++ - 在 macOS 上覆盖 malloc

c++ - 默认析构函数有什么用?