模板化参数的 C++ 静态评估
C++ static evaluation of templated argument
我似乎无法开始工作的功能:
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);
}
}
功能:
根据 事件,我想将 回调 添加到回调函数
的容器中
注意:
每个容器都基于 不同的 模板版本的 std::function<>
我想达到的目标:
要在编译时评估的表达式,从而根据 event 生成函数体。因此,如果 m_type1Callbacks 在 std::function 上模板化,函数:
Add(Event::Type1, [](int foo){std::cout << foo << std::endl;}));
应该添加到m_type1Callbacks
我的问题:
当我尝试上面的代码时,出现错误:
'event' is not a constant expression
我需要什么帮助:
我从根本上解决这个问题的方法是错误的吗?我该如何改进和解决这个问题?
提前致谢!
如果您将 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);
}
}
我似乎无法开始工作的功能:
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);
}
}
功能: 根据 事件,我想将 回调 添加到回调函数
的容器中注意: 每个容器都基于 不同的 模板版本的 std::function<>
我想达到的目标: 要在编译时评估的表达式,从而根据 event 生成函数体。因此,如果 m_type1Callbacks 在 std::function 上模板化,函数:
Add(Event::Type1, [](int foo){std::cout << foo << std::endl;}));
应该添加到m_type1Callbacks
我的问题: 当我尝试上面的代码时,出现错误:
'event' is not a constant expression
我需要什么帮助: 我从根本上解决这个问题的方法是错误的吗?我该如何改进和解决这个问题?
提前致谢!
如果您将 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);
}
}