Я работаю над улучшением собственной библиотеки сообщений, предназначенной для отправки сообщений внутри наших приложений и для внешних потребителей. Сообщение состоит из MessageType
(enum class
) и некоторых данных (struct
). Каждый MessageType::
соответствует конкретному типу данных (например, MessageType::TypeA
всегда будет содержать Foo
). Однако несколько типов сообщений могут использовать одну и ту же структуру (например, MessageType::TypeM
также может использовать Foo
).Выполнение желаемой взаимосвязи между параметрами функции шаблона
У нас есть класс, который может отправлять сообщения. Наша предыдущая реализация класса отправителя сообщения определяет метод для каждого типа:
SendMessageTypeA(Foo data)
SendMessageTypeB(Bar data)
SendMessageTypeM(Foo data)
Когда есть много сообщений, это может привести к много дублирования коды (тело метода, по существу, то же самое, за исключением различных типов параметров).
Я реализовал новый метод:
template<typename structType>
void Send(MessageType msgType, const structType & messageData)
Этот единственный метод может отправить любое сообщение, в зависимости от соответствующего параметра шаблона предоставляется. Обратите внимание, что MessageType
всегда известен во время компиляции.
Проблема в том, что этот новый метод не обеспечивает связь между MessageType
и struct
. Например, Send<Foo>(MessageType::TypeB, data)
будет компилироваться, хотя MessageType::TypeB
должен содержать Bar
. Несоответствие будет обнаружено во время выполнения, но я хочу сделать это ошибкой времени компиляции.
Я не уверен, как достичь этого. Я рассмотрел:
- Декларирование все
SendMessageX()
методы, и использовать их для вызоваSend<MessageX>()
. Это уменьшает дублирование, но мне все равно приходится создавать новый метод каждый раз, когда будет определено сообщение. - Попытка использования
static_assert
, чтобы поймать несоответствие. Я не уверен, как нарисоватьMessageType
s по желаниюstruct
. - Я ложному дерево
Знаете ли вы, что сообщения перечислены во время компиляции? – Barry
Да, ассоциация известна во время компиляции – endorph
Не ассоциация, значения, которые вы вызываете 'Send()' with. – Barry