【问题标题】:C++ static evaluation of templated argument模板化参数的 C++ 静态评估
【发布时间】:2020-05-25 12:55:41
【问题描述】:

我似乎无法使用的功能:

void Add(const Event &event, T callback) noexcept
    {
        if constexpr (event == Event::Type1)
        {
            m_type1callbacks.push_back(callback);
        }
        else if constexpr (event == Event::Type2)
        {
            m_type2Callbacks.push_back(callback);
        }
        else if constexpr (event == Event::Type3)
        {
            m_type3Callbacks.push_back(callback);
        }
        else if constexpr (event == Event::Type4)
        {
            m_type4LeaveCallbacks.push_back(callback);
        }
    }

功能: 根据 event 我想将 callback 添加到回调函数的容器中

注意: 每个容器都在std::function

不同模板化版本上进行模板化

我想要达到的目标: 在编译时要评估的表达式,从而根据 event 生成函数体。因此,如果 m_type1Callbacksstd::function 上被模板化,则函数:

Add(Event::Type1, [](int foo){std::cout << foo << std::endl;}));

应该添加到m_type1Callbacks

我的问题: 当我尝试上面的代码时,我得到了错误:

'event' is not a constant expression

我需要帮助: 我解决这个问题的方法从根本上是错误的吗?我应该如何改进和解决这个问题?

提前致谢!

【问题讨论】:

  • eventconst 但不是 constexpr。您不能在 if constexpr 中使用运行时参数

标签: c++ templates static-methods


【解决方案1】:

如果您将event 作为函数的模板参数,您将能够在constexpr 上下文中使用它:

template <Event event>
void Add(T callback) noexcept
{
    if constexpr (event == Event::Type1)
    {
        m_type1callbacks.push_back(callback);
    }
    else if constexpr (event == Event::Type2)
    {
        m_type2Callbacks.push_back(callback);
    }
    else if constexpr (event == Event::Type3)
    {
        m_type3Callbacks.push_back(callback);
    }
    else if constexpr (event == Event::Type4)
    {
        m_type4LeaveCallbacks.push_back(callback);
    }
}

【讨论】:

  • 完美运行!感谢您的澄清和快速回答:)
猜你喜欢
  • 2016-11-05
  • 2013-01-02
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
相关资源
最近更新 更多