Есть ли 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. Это возможно?