Как уже говорили другие, в общем случае это невозможно, но я думаю, что было бы полезно узнать, почему бы и нет.
Существует два уровня проблемы: синтаксический уровень и семантический уровень.
На уровне синтаксиса у вас есть следующий код:
dynamic d = /* something */;
d.Foo(bar); // Foo is unknown at compile time
В .NET dynamic
это функция компилятора, которая вместо генерации вызов функции создает сайт вызова , который содержит имя функции и типы параметров (для перегрузки).Это означает, что если вы хотите поддерживать динамический, у вас есть для изменения компилятора.Это правда, что шаблонное метапрограммирование позволяет делать подобные вещи, но TMP по своей природе выполняется во время компиляции и, следовательно, не справится с задачей поддержки вызова во время выполнения.
Если вы не разбираетесь в синтаксисетогда вы сможете поддерживать что-то вроде этого:
dynamic d = /* something */;
d.invoke("Foo", bar);
На семантическом уровне Как сказал @ Trillian (крутое имя пользователя BTW), динамическое зависит ототражением, это не совсем верно, вы можете указать, как dynamic
реализовано , и типом по умолчанию для типов CLR является отражение, поэтому тип, связанный с переменной dynamic
, должен поддерживать какой-то типпроверка во время выполнения (например, COM IDispatch
).Это не верно для общего случая в C ++, но если вы можете сузить свою поддержку только до типов, которые поддерживают (известный) тип проверки, вы можете реализовать dynamic
в C ++ (без синтаксиса, как указано выше).