C ++ stati c оценка шаблонного аргумента - PullRequest
2 голосов
/ 25 мая 2020

Функция, с которой я не могу работать:

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);
        }
    }

Функциональность: в зависимости от события Я хочу добавить обратный вызов в контейнер callback-functions

Примечание. Каждый контейнер создан на основе различных шаблонных версий std :: function <>

То, что я хочу достичь: Выражение, которое будет оцениваться во время компиляции и, таким образом, генерировать тела функций в зависимости от события . Итак, если m_type1Callbacks задан на std :: function , функция:

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

должна быть добавлена ​​к m_type1Callbacks

Моя проблема: Когда я пытаюсь выполнить приведенный выше код, я получаю сообщение об ошибке:

'event' is not a constant expression

В чем мне нужна помощь: является ли мой способ решения этой проблемы неправильным с фундаментальной точки зрения? Как мне улучшить и решить эту проблему?

Заранее спасибо!

1 Ответ

2 голосов
/ 25 мая 2020

Если вы сделаете 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);
    }
}
...