Size: a a a

2021 April 25

Т8

Т-34 85 in rust_offtopic
как ты себе это представляешь под капотом? У тебя же тупо по памяти будет несоответствие. И хорошо, если ты заменишь тип на такой же по размеру, можно кастовать через void*
@nlinker
источник

Т8

Т-34 85 in rust_offtopic
Переслано от Nick Linker
Привет, как я могу заиметь в базовом классе не только виртуальные методы, но и "виртуальный" тип, таким образом я бы мог его переопределить в производном классе?
Хочется сделать что-то вроде:
class IteratorBase {
public:
   using Out;  // <<< to be defined
   virtual ~IteratorBase() { }
   virtual Out next() = 0;
   virtual unsigned long sizeHint() const = 0;
};

template<class Container>
class OwnIterator : public IteratorBase {
public:
   using IterType = typename std::remove_const<typename Container::const_iterator>::type;
   using Out = typename std::iterator_traits<typename Container::const_iterator>::value_type;
private:
   Container container;
   IterType iter;
public:
   OwnIterator(Container c) : container(std::move(c)), iter(container.begin()) {}

   Out next() { ... return *iter; }
   ...
   // and so on
   ...
};
источник

NL

Nick Linker in rust_offtopic
Можно глянуть ржавый Iterator, там Item прекрасно (пере)определяется в конкретных итераторах.
источник

Т8

Т-34 85 in rust_offtopic
но там и не наследование. Наследование подразумевает возможность апкаста, а как ты апкастнешь, если у тебя несоответствие по памяти будет?
источник

O

Ofee in rust_offtopic
Компилятор видит, что мы вызываем

auto IteratorBase::next()
   -> /* ??? *
/

Сколько памяти на стеке мы должны выделить под возвращаемое значение? А что мы можем с ним делать? Копировать можем? Вызвать на нём next можем?
источник

NL

Nick Linker in rust_offtopic
Справедливо. Что если Out будет только указателем?
источник

Т8

Т-34 85 in rust_offtopic
тогда можно. Будешь либо через static_cast<void*>() фигачить, либо напрямую через reinterpret_cast<>()
источник

Т8

Т-34 85 in rust_offtopic
но типобезопасность пострадает
источник

Т8

Т-34 85 in rust_offtopic
std::any хотя б рантайм чекинг предоставит
источник

Т8

Т-34 85 in rust_offtopic
@webreh @oficsu @unterumarmung я нигде фигню не сморозил?
источник

O

Ofee in rust_offtopic
Тогда это может быть OutBase, у которого описан требуемый интерфейс
источник

O

Ofee in rust_offtopic
Нигде, за исключением того, что это вообще-то XY-problem и её нужно решать иначе
источник

Т8

Т-34 85 in rust_offtopic
@nlinker а ты вообще какую задачу решаешь? Может, лучше другой путь искать?
источник

NL

Nick Linker in rust_offtopic
Я ищу пути передачи плюсового итератора в Rust. Сейчас всё работает за исключением одного но: заводить отдельное имя на каждый инстанс грустно, вот я и делаю попытку примотать изолентой общего предка IteratorBase.
источник

Т8

Т-34 85 in rust_offtopic
да, через сишный ABI прокидывать больно... Наверное, придётся брать std::any и идти путём C# 1.  void* стирает инфу, надо либо в compile time знать, где какой тип, либо тащить как-то доп. инфу
источник

Т8

Т-34 85 in rust_offtopic
о, кстати, изящно! https://t.me/ProCxx/444995
источник

RP

Roman Proskuryakov in rust_offtopic
А зачем тебе виртуальный?
источник

RP

Roman Proskuryakov in rust_offtopic
Почему не хочешь параметризовать экзистенциальным типом?
источник

RP

Roman Proskuryakov in rust_offtopic
Благо в С++ они есть, в отличие от)
источник

NL

Nick Linker in rust_offtopic
Гуглю, смотрю, как выглядят экзистеншиалы в C++, может быть подойдёт решение.
источник