Size: a a a

2021 April 14

МВ

Макс Воробьев... in dlang.ru
как происходит каст к базовому классу?
источник

МВ

Макс Воробьев... in dlang.ru
Base as_channel = m_data;
источник

МВ

Макс Воробьев... in dlang.ru
после каста указатели as_channel и m_data не равны
источник

МВ

Макс Воробьев... in dlang.ru
источник

МВ

Макс Воробьев... in dlang.ru
as_channel = *(cast(Base*)(&m_data));
источник

МВ

Макс Воробьев... in dlang.ru
зато так - норм
источник

SG

Serg Gini in dlang.ru
to! не работает тут?
источник

МВ

Макс Воробьев... in dlang.ru
нет
источник

МВ

Макс Воробьев... in dlang.ru
такое чувство, что vptr где-то теряется
источник

МВ

Макс Воробьев... in dlang.ru
с таким способом падают вызовы as_channel из D
источник

МВ

Макс Воробьев... in dlang.ru
а таким - из ++
источник

МВ

Макс Воробьев... in dlang.ru
cannot pass argument this.m_data of type Derived to parameter ref Base
источник
2021 April 15

DH

Dark Hole in dlang.ru
export(C++)?
источник

МВ

Макс Воробьев... in dlang.ru
есть
источник

DH

Dark Hole in dlang.ru
Мб дело в нем, не?
источник

МВ

Макс Воробьев... in dlang.ru
не конкретно в нем, но где-то рядом
источник

МВ

Макс Воробьев... in dlang.ru
если передавать объекты без каста к базовым интерфейсам в ++, то все норм
источник

МВ

Макс Воробьев... in dlang.ru
ладно. подумаю над этим завтра
источник

МВ

Макс Воробьев... in dlang.ru
lib.cpp
#include <iostream>

namespace Test {
   class Base {
   public:
       virtual ~Base() = default;
       virtual void test() = 0;
   };

   class Derived: public Base {
   public:
       void test() { std::cout << "Test" << std::endl; }
   };

   Derived * make() {
       return new Derived;
   }

   void free(Derived *& p) {
       delete p;
       p = nullptr;
   }

   void exec_test(Base * p) { p-> test(); }
}
источник

МВ

Макс Воробьев... in dlang.ru
main.d
extern (C++, Test) {
   interface Base {
       void test();
   }

   class Derived: Base {
       void test();
   }

   Derived make();

   void free(ref Derived p);

   void exec_test(Base p);
}

void main(string[] args)
{
   Derived d = make();
   scope(exit) free(d);
   Base as_base = d;
   exec_test(as_base);
}
источник