Вы можете использовать динамическое приведение, чтобы проверить, принадлежит ли объект подтипу типа, известного во время компиляции. Механизм изменения поведения в зависимости от типа объекта во время выполнения представляет собой виртуальную функцию, которая дает вам область, в которой тип получателя известен во время компиляции.
Таким образом, вы можете добиться того же эффекта с помощью виртуальной функции, чтобы у вас был тип во время компиляции с одной стороны, а затем динамическое приведение, чтобы проверить другую сторону по отношению к этому типу:
#include <iostream>
class Plugin {
public:
virtual bool objectIsDerivedFromMyClass ( const Plugin & object ) const = 0;
};
template <typename T, typename BasePlugin = Plugin>
class TypedPlugin : public BasePlugin {
public:
virtual bool objectIsDerivedFromMyClass ( const Plugin & object ) const {
return dynamic_cast<const T*> ( &object ) != 0;
}
private:
int CheckMe(const T*) const;
};
class PluginA : public TypedPlugin<PluginA> {};
class PluginB : public TypedPlugin<PluginB, PluginA> {};
class PluginC : public TypedPlugin<PluginC> {};
int main () {
PluginA a;
PluginB b;
PluginC c;
std::cout << std::boolalpha
<< "type of a is derived from type of a " << a.objectIsDerivedFromMyClass ( a ) << '\n'
<< "type of a is derived from type of b " << b.objectIsDerivedFromMyClass ( a ) << '\n'
<< "type of b is derived from type of a " << a.objectIsDerivedFromMyClass ( b ) << '\n'
<< "type of c is derived from type of a " << a.objectIsDerivedFromMyClass ( c ) << '\n'
;
return 0;
}
(Вы также можете добавить проверку, которая T
расширяет TypedPlugin<T>
)
Это не совсем двойная отправка, хотя dynamic_cast
полиморфна во время выполнения по своему аргументу, поэтому она довольно близка.
Хотя для чего-то гораздо более сложного (или если вы хотите придерживаться своего первоначального стиля сравнения объектов, представляющих типы времени выполнения объектов, которые у вас есть), вам нужно начать создавать метаклассы или использовать существующую инфраструктуру, которая предоставляет метаклассы. Поскольку вы говорите о плагинах, возможно, у вас уже есть где-то указать свойства конфигурации или зависимости, и это тоже можно использовать для этого.