Когда сталкиваешься с проблемой, часто приходит идея о том, как ее решить, и мы тратим наши усилия на то, как реализовать это решение. Иногда лучше вернуться к проблеме и подумать о других решениях.
Например, вместо того, чтобы Authenticator
пытаться уведомить ClientSession
, который был передан в него (или, что еще лучше, вызывая какой-то обратный вызов , переданный в него), как насчет того, чтобы позволить ClientSession
(или какой-либо другой объект / поток) вызывает метод, подобный Authenticator::waitForAuthentication(int timeout)
?
Редактировать: Я думал, что уточню понятие callback . Дело в том, что Authenticator
не нужно знание класса ClientSession
, чтобы выполнять свою работу; ему просто нужно знать, чтобы вызвать какую-либо функцию или другую вызываемую функцию.
Итак, вы пишете свой Authenticator
, чтобы иметь метод, который принимает некоторый std::function
объект с правильной подписью, и ClientSession
(или любой другой) создает подходящую вещь для передачи. Это может быть специализированная функция объект похож на то, что предлагает Лучиан Григоре. Может быть, это немного более общий объект, или, может быть, тот, который инициализируется ссылками на приватные части вашего ClientSession
объекта. Или это лямбда, если вы можете использовать C ++ 11.
Тем не менее, я подозреваю, что метод waitForAuthentication
(или что-то еще полностью) вполне может быть тем, что вы действительно хотите для своего приложения.