Как определить совместимость типов для шаблона mixin неполиморфного типа - PullRequest
1 голос
/ 02 сентября 2011

Если у меня есть дополнение, определенное как ...

template<class T> class Mixin : public T
{
    // mixin methods and members
};

... и объявить его с T как неполиморфный класс ...

Mixin<NonPoly> mixin;

.. а затем указатель базового класса на него ...

NonPoly* nonPolyPtr = &mixin;

... как я могу позже убедиться, что nonPolyPtr указывает на тип Mixin?

dynamic_cast<Mixin*>(nonPolyPtr)

Выше не компилируется, потому что базовый класс является неполиморфным.

Я видел, что в Boost есть некоторые классы черт, которые могут помочь, но я надеюсь, что есть более простое решение, которое я пропускаю.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Я думаю, что вы смотрите на неправильные требования.Вам не нужно выполнять кастинг, но вам может потребоваться реструктуризация кода.Если у вас есть связь классов A, которая создает mixin и B, который использует NonPoly, просто передайте B указатель NonPoly и используйте mixin непосредственно в A. Не должно быть никаких причин для того, чтобы отказаться от информации о типе в A, просто чтобы попытатьсяверни его снова.Если есть больше классов, разделите их на тех, кто знает миксин и тех, кто знает NonPoly, и это те же отношения.

И очень вероятно, что, если это в первую очередь, миксиндизайн не правильный подход.Очень часто миксины используются, когда необходимо простое сдерживание.В моем примере с A и B выше, у вас может быть класс Mixin

template <typename T>
class Mixin
{
  T * GetObject()
  { return & t_; }

  // other methods that use t_
private:
  T t_;
};

, а затем просто передать объект, когда он нуждается в операции.Или, что еще более распространено, если вы просто передаете T какой-нибудь сторонней библиотеке, вам вообще не нужен миксин.Сдерживание может быть даже не лучшим.Лучший способ поддерживать инкапсуляцию - это всегда писать алгоритмы области файлов, когда вы можете манипулировать типом T через его открытый интерфейс и общедоступные подпрограммы сторонних производителей.

Если вы можете объяснить, почему вы считаете, что вам нужно потерять типинформацию, а затем восстановить, мы могли бы более четко показать, как вы можете реструктурировать владение так, чтобы это не происходило, но так как эта информация типа никогда не покидает среду выполнения (так как вы ищете для приведения - ваш вопрос подразумевает, что это не такполучить сериализацию или что-то еще), я могу заверить вас, что есть какой-то дизайн, в котором информация о типе не теряется в первую очередь.

0 голосов
/ 02 сентября 2011

Если вы уверены в его типе, просто используйте static_cast для понижения. Вам также необходимо указать параметр шаблона в приведении Mixin<NonPoly>*.

template<class T>
class Mixin : public T
{
    // mixin methods and members
};

class NonPoly {
};

int main() {
  Mixin<NonPoly> mixin;
  NonPoly* nonPolyPtr = &mixin;

  Mixin<NonPoly>* mixinPtr = static_cast<Mixin<NonPoly>*>(nonPolyPtr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...