Это продолжение вопроса this.Диспетчер методов обработки шаблонов
У меня есть различные методы шаблонов, каждый из которых для различного рода сообщения, используя параметры шаблона не типа и специализации шаблона:
namespace Handlers {
enum MSG_TYPES {
MSG1,
MSG2
};
template<MSG_TYPES>
void handle_message() {
// Default handler : not defined type
}
template<>
void handle_message<MSG1>() {
cout << "Handle 1";
}
template<>
void handle_message<MSG2>() {
cout << "Handle 2";
}
Теперь я хотел бы иметь какой-то другой способ, чтобы направить в правильный обработчик. Что-то вроде
template<typename T>
void handle(T t) {
try {
handle_message<T>();
} catch(...) {
}
}
, которые могут быть вызваны как
int i = 0;
Handlers::handle(static_cast<Handlers::MSG_TYPES>(i));
Так, как это диспетчерская может быть достигнуто?
PS: Предыдущий код не будет работать на handle_message<T>();
из-за
Примечание: аргумент шаблона вычет/замена не удалась:
не должен по умолчанию обработчик будет вызван?
Какую функцию вызывать - это решение * компиляции-времени *, но похоже, что ваше значение 'i' может быть неизвестно до * времени выполнения *. – aschepler
@aschepler Да, я смешиваю время выполнения и время компиляции. Итак, я остался с подобной коммутатору структурой, чтобы решить, какой метод вызывать, как только я узнаю идентификатор сообщения (i)? – perencia
Вы передаете тип шаблону, ожидающему значение перечисления; неудивительно, что он пытался вывести аргумент. –