У меня есть код, который использует несколько скрытый отбрасывания от базового класса до типа дочернего класса, где тип дочернего класса указан как параметр шаблона. Я предполагаю, что, поскольку базовый класс не объявляет никаких элементов данных и имеет нулевой размер, адрес указателя базового класса будет таким же, как и у ребенка, и приведение будет успешным. Пока код работает правильно.Вставить пустой указатель базового класса в указатель на дочерний класс?
Вот упрощенная версия того, что я делаю:
template <class RangeT>
struct CppIterator {
CppIterator(const RangeT& range) { ... }
// ... methods calling RangeT's members
};
// Base class, provides begin()/end() methods.
template<class RangeT>
struct CppIterableBase {
CppIterator<RangeT> begin() {
return CppIterator<RangeT>(*(RangeT*)this); // Is this safe?
}
CppIterator<RangeT> end() { ... }
};
struct MyRange : CppIterableBase<MyRange> {
// ...
};
Мой вопрос заключается в основном - это код кошерным? Будет ли указатель базы всегда приравниваться к дочернему указателю, если база пуста? Это зависит от реализации? Попаду ли я в беду?
Он решает мою проблему красиво, но я немного сомневаюсь.
Почему вы (думаете) вам это нужно? –
У меня есть множество типов диапазонов - наследование не позволяет мне снова и снова определять те же методы begin() и end(). – QuadrupleA
Я имел в виду, почему вам нужно использовать его, а не почему вам нужен класс итератора с типом шаблона. –