То, что я хочу сделать, даже разрешено?
Абсолютно.Пока вы приводите его обратно к точно типу, который вы ему дали.
И это ваша проблема.Вы неfoo2
не является voidFunction
.Следовательно, вы не можете привести его к единице.
Цель boost::any
состоит в том, чтобы иметь void*
, который гарантированно либо работает правильно в соответствии со стандартом C ++, либо выдает исключение.Стандарт C ++ позволяет преобразовывать любой (не являющийся членом) тип указателя в void*
.Это также позволяет преобразовывать void*
обратно в тип при условии, что предоставляемый тип точно такого же типа , что и оригинал.Если это не так, добро пожаловать в неопределенное поведение.
boost::any
существует, чтобы предотвратить неопределенное поведение, сохраняя информацию о типе с void*
.Это правильно сгенерирует исключение, когда вы попытаетесь привести что-то к неправильному типу.Как вы делаете здесь.boost::any
- это , а не способ притвориться, что типы не существуют, и притвориться, что вы можете превратить что-либо во что-то другое.Это просто типобезопасный контейнер без типа.Вам все еще нужно знать, что вы на самом деле поместили туда.
Невозможно сохранить список функций с произвольными списками аргументов и вызывать их с тем же списком аргументов.Пользователь должен предоставить функции или функтору правильный список аргументов, который вы ожидаете.boost::bind
- это способ адаптации функции / функтора для определенного списка аргументов, но пользователь должен явно использовать его.
Лучшее, что вы можете сделать, - это иметь список определенных наборов параметров функции, которые вы принимаете,хранится в объекте boost::variant
.Вы можете использовать посетителя, чтобы выяснить, какую функцию вызывать.