Size: a a a

2020 October 28

CD

Constantine Drozdov in pro.cxx
вроде бы для любого компилятора достаточно дальше сравнить type_handle и C<P1<2,4>>::name() на равенство как указатели
источник

AG

Anton Glukhov in pro.cxx
Обновил то как это должно использоваться
==================
FRAMEWORK

class PackageBase
{
   virtual size_t size() = 0;
   virtual size_t weight() = 0;
}

Class C {
    PackageBase p_;

   set_package(PackageBase &&p);
   is_package(const PackageBase &p); // deep copy?!
}

===================
USAGE

template<std::size_t P, std::size_t N>
class P1 : public  PackageBase {…}

template<typename T>
class P2 : public  PackageBase {…}

C c;
c.set_package(std::move(P<2, 5>{weight = 5}));
c.is_package(P<2, 5>{weight = 5});  // Создавать объект не надо. Достаточно сравнить тип
источник

D

Dmitriy in pro.cxx
А нет ли возможности разделить constexpr и не-constexpr конструктор?
источник

D

Dmitriy in pro.cxx
С одинаковыми аргументами
источник

CD

Constantine Drozdov in pro.cxx
    static char * name() {
       static constexpr char* id = __FUNCTION__;
       return id;
   }

вроде вот так надежнее
источник

AG

Anton Glukhov in pro.cxx
Constantine Drozdov
Ну тогда для C<P1<2, 4>> это вопрос о сравнении его динамического типа и C<P1<2, 4>> и для этого можно не включать RTTI если он выключен - достаточно там
struct CBase {
  virtual const char* type_handle() const = 0;
};
template <typename T>
class C : public CBase {
   static constexpr char * name() {
        return __FUNCTION__;
   }
   const char* type_handle() const override {
       return name();
   }
};
Блин, не въезжаю… можешь показать пример использования? Как мы создаем С в системе?
источник

CD

Constantine Drozdov in pro.cxx
Anton Glukhov
Блин, не въезжаю… можешь показать пример использования? Как мы создаем С в системе?
Да как хотим, C<P1>{ /*forward to P1 ctor*/ }; уже работает. Полиморфное C это CBase&
источник

AG

Anton Glukhov in pro.cxx
Constantine Drozdov
Да как хотим, C<P1>{ /*forward to P1 ctor*/ }; уже работает. Полиморфное C это CBase&
Ну т.е. мы создаем кучу С под каждый тип, так?
источник

CD

Constantine Drozdov in pro.cxx
Anton Glukhov
Ну т.е. мы создаем кучу С под каждый тип, так?
Под каждый PackageBase, да. При этом никто нас не заставляет, скажем, не писать функции в CBase
источник

AG

Anton Glukhov in pro.cxx
Тут есть момент про который вскольз упомянул. В контейнере С есть функция c.exec() который вызывается из прерывания. Прерывания частый (по таймеру). т.е. у нас есть глобальный объект из которого мы вызываем в прерывании один метод постоянно. Это помимо остального
источник

AG

Anton Glukhov in pro.cxx
Ну т.е. фактически как я это вижу, мы не можем насоздавать разных объектов контейнеров под каждый тип.
источник

CD

Constantine Drozdov in pro.cxx
Anton Glukhov
Тут есть момент про который вскольз упомянул. В контейнере С есть функция c.exec() который вызывается из прерывания. Прерывания частый (по таймеру). т.е. у нас есть глобальный объект из которого мы вызываем в прерывании один метод постоянно. Это помимо остального
Если C в вашей версии хранит полиморфный PackageBase, сам по себе C не может не быть полиморфен
источник

AG

Anton Glukhov in pro.cxx
ну мы можем хранить variant, так?
источник

CD

Constantine Drozdov in pro.cxx
variant ничего не изменит в целом
источник

CD

Constantine Drozdov in pro.cxx
это будет тот же самый полиморфный C, который спасся от аллокации при хранении полиморфного PackageBase (и получил за это врожденный архитектурный дефект, объявив полиморфную сущность как ADT)
источник

CD

Constantine Drozdov in pro.cxx
Anton Glukhov
Тут есть момент про который вскольз упомянул. В контейнере С есть функция c.exec() который вызывается из прерывания. Прерывания частый (по таймеру). т.е. у нас есть глобальный объект из которого мы вызываем в прерывании один метод постоянно. Это помимо остального
Вызов exec() задействует PackageBase?
источник

AG

Anton Glukhov in pro.cxx
Constantine Drozdov
Вызов exec() задействует PackageBase?
ага. как раз в этом методе вызываются size и weight
источник

CD

Constantine Drozdov in pro.cxx
Если да, то в какой-то момент он узнал фактический тип PackageBase.
источник

AG

Anton Glukhov in pro.cxx
Я тут подумал. теоретически можно организовать пул из которого аллоцировать память. и тогда хранить просто указатель. Может это поможет?
источник

CD

Constantine Drozdov in pro.cxx
Этого уже в принципе нельзя избежать - виртуальный вызов тут будет до тех пор, пока вы не запишете C<P1>::exec неполиморфно вектором прерывания
источник