模板化参数的 C++ 静态求值

标签 c++ templates static-methods

我似乎无法使用的功能:

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<>

上进行模板化

我想要达到的目标: 要在编译时计算的表达式,从而根据事件生成函数体。因此,如果 m_type1Callbacksstd::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);
    }
}

关于模板化参数的 C++ 静态求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62002852/

相关文章:

templates - playframework : i18n + scala

C++ 在编译时检查继承

c++ - 如何使用模板将 QString 转换为类型名?

全局对象中定义的类中的 Javascript 静态方法

python - 模块函数 vs 静态方法 vs 类方法 vs 无装饰器 : Which idiom is more pythonic?

c++ - 代码生成期间的宏替换

可用于许多对象的 c++ 全局映射

C++:strchr() 上的指针分配警告

c++段错误试图访问 vector

Java 错误做法做 : new. .. ().doSomething()?