Самое простое решение - сделать все варианты А наследуемыми от общего интерфейса, даже если он пуст:
class IA{}
template <class T>
class A : public IA
{
public:
T value;
};
class B
{
public:
IA* value;
};
Теперь связанные затраты:
- взаимодействия сзначение ограничено интерфейсом IA;
- , если вы пытаетесь привести тип к реальному типу, это означает, что вы знаете настоящий тип, так что он бесполезен, и сделать тип A параметром B становится действительно прощеиспользовать.
- существуют затраты времени выполнения, связанные с наследованием времени выполнения
Преимущество:
- это легко понять другим разработчикам
- этоестественно ограничить возможные типы некоторыми
- он не использует повышение (иногда вы просто не можете)
Так что для улучшения есть другие, менее простые решения, нокоторые достаточно просты для использования:
Если вы можете использовать boost, boost :: any, boost :: variable и boost :: mpl, это может быть основой решений.
Boost any может бытьиспользуется в качестве безопасной замены для аннулирования *.Единственная проблема с этим заключается в том, что вы можете иметь ЛЮБОЙ тип, например, если тип был параметром шаблона класса B.
Вариант повышения может успешно использоваться, если вы знаете все типы, которые могут быть в A.
MPL может быть полезен, если вы просто хотите установить список возможных типов и убедиться, что ваши участники относятся только к ним.Вы можете сделать кучу вещей с MPL, так что это действительно зависит от ваших конкретных потребностей.