Есть ли C++/CLI, эквивалентный C# приведению к динамическому типу?

Я расширяю иерархию классов, написанную на C#, которая реализует шаблон Visitor (двойная диспетчеризация) с использованием динамического ключевого слова, как описано здесь.

Вот очень упрощенный псевдокод того, что я сейчас делаю в C#:

public class Command { 
   ...
}

public class RunCommand : Command {
   ...
}


public class Base {
   ...
   // Double-dispatch interface 
   public virtual void AcceptCommand(Command command) {
      HandleCommand((dynamic)command);
   }

   // Example of a specialization that handles a RunCommand 
   protected virtual void HandleCommand(RunCommand command) {
     ...
   }
}

Теперь, когда я расширяю иерархию, производные классы могут потребовать обработки новых Command специализации не известны базовому классу. В этом случае двойная диспетчеризация не удастся (кажется, что динамическое разрешение перегрузки не будет пересекать расширенную иерархию классов при попытке сопоставить метод). Это легко исправить (описано в ранее связанной статье) и состоит в переопределении AcceptCommand() метод в производном классе (дублирующий исходную реализацию), например так:

public class Derived : Base {
   // Override to allow double-dispatch to handle commands introduced by Derived
   public override void AcceptCommand(Command command) {
      HandleCommand((dynamic)command);
   }
}

Недавно мне потребовалось расширить иерархию с помощью классов из проекта, реализованного в C++/CLI для удобства (большое взаимодействие с неуправляемым кодом API WIN32). Этот проект представил несколько Command специализации, поэтому мне нужно переопределить AcceptCommand() метод в классе C++/CLI, как я делаю в C#, чтобы исправить двойную диспетчеризацию, но проблема в том, что я не знаю, как выполнить приведение Command Объект динамического типа в синтаксисе C++/CLI. Это возможно?

0 ответов

Другие вопросы по тегам