Size: a a a

2020 August 20

NP

Nikita Provotorov in pro.cxx
аля
template<typename Derived>
struct Base
{
   template<typename T>
   void foo(T obj)
   {
       static_cast<Derived*>(this)->fooImpl(obj);
   }

};


struct PolymorphicHolder
{
public:
  template<typename T>
  void invokeFoo(T val)
  {
      // ???
  }

private:
  struct ImplBase
  {
      // ???

      virtual ~ImplBase() = default;
  };

  template<typename Derived>
  struct Impl : ImplBase
  {
      // inherited from Base<Derived>
      Derived obj;
  };

  ImplBase* impl_;  
};

Собсна в изначальном вопросе AbstractInterface == ImplBase, passThrough == invokeFoo
источник

NP

Nikita Provotorov in pro.cxx
Впрочем, ответ на SO не обнадеживает:
If you need BaseVisited's derived classes to be templated too AND pass their correct types/overloads to visit, you're officially dead.
источник

IZ

Ilia Zviagin in pro.cxx
Nikita Provotorov
Ребят, такой вопросик. Предположим у нас есть интерфейс и шаблонная свободная функция:

struct AbstractInterface
{
   // pure-virtual methods
};

template<typename T>
void passThrough(AbstractInterface* dst, T val)
{
   // ...
}

Можно ли как-нибудь в реализацию AbstractInterface передать реальный тип объекта val, т.е. T?
Содержимое как AbstractInterface, так и тело passThrough можно свободно менять
Вообще, в ООП выделять тип объекта в виде переменной - это антипаттерн.

Надо диспетчеризацию делать по динамическому типу за счёт виртуальных методов .
источник

IZ

Ilia Zviagin in pro.cxx
Nikita Provotorov
Ребят, такой вопросик. Предположим у нас есть интерфейс и шаблонная свободная функция:

struct AbstractInterface
{
   // pure-virtual methods
};

template<typename T>
void passThrough(AbstractInterface* dst, T val)
{
   // ...
}

Можно ли как-нибудь в реализацию AbstractInterface передать реальный тип объекта val, т.е. T?
Содержимое как AbstractInterface, так и тело passThrough можно свободно менять
Ну и похоже шаблонный passThrough тут излишне делать, это ему не нужно
источник

IZ

Ilia Zviagin in pro.cxx
Nikita Provotorov
Ребят, такой вопросик. Предположим у нас есть интерфейс и шаблонная свободная функция:

struct AbstractInterface
{
   // pure-virtual methods
};

template<typename T>
void passThrough(AbstractInterface* dst, T val)
{
   // ...
}

Можно ли как-нибудь в реализацию AbstractInterface передать реальный тип объекта val, т.е. T?
Содержимое как AbstractInterface, так и тело passThrough можно свободно менять
А, тут тебе нужна множественная диспетчеризация, в с++ реализуется как паттерн Visitor
источник

NP

Nikita Provotorov in pro.cxx
Ilia Zviagin
А, тут тебе нужна множественная диспетчеризация, в с++ реализуется как паттерн Visitor
Не прокатывает тут визитор из-за шаблонного параметра
источник

IZ

Ilia Zviagin in pro.cxx
Nikita Provotorov
Ребят, такой вопросик. Предположим у нас есть интерфейс и шаблонная свободная функция:

struct AbstractInterface
{
   // pure-virtual methods
};

template<typename T>
void passThrough(AbstractInterface* dst, T val)
{
   // ...
}

Можно ли как-нибудь в реализацию AbstractInterface передать реальный тип объекта val, т.е. T?
Содержимое как AbstractInterface, так и тело passThrough можно свободно менять
Ты тут просто не передашь этот T никуда, у него должен быть общий предок для этого, а ты пишешь, что Т - произвольный.

Тогда ты его только через void* можешь передать, а это сам знаешь неверно , что...
источник

IZ

Ilia Zviagin in pro.cxx
Nikita Provotorov
Не прокатывает тут визитор из-за шаблонного параметра
Он не нужен тут, шаблон и параметр
источник

IZ

Ilia Zviagin in pro.cxx
/ban
источник

AK

Andrei K in pro.cxx
Nikita Provotorov
хочу написать type-erasure обертку для CRTP-based иерархии классов. Один из методов в родительском CRTP классе-шаблонный
А если не секрет, зачем так?
источник

AK

Andrei K in pro.cxx
Делайте уж везде динамический полиморфизм.
источник

AK

Andrei K in pro.cxx
Зачем CRTP если он потом всё равно мешается с виртуальными функциями?
источник

NP

Nikita Provotorov in pro.cxx
Andrei K
Зачем CRTP если он потом всё равно мешается с виртуальными функциями?
ну CRTP в либе, а мне внезапно динамический полиморфизм понадобился)
источник

AK

Andrei K in pro.cxx
А типов совсем заранее неизвестно сколько?
источник

AK

Andrei K in pro.cxx
Можно протащить так-то через std::variant
источник

NP

Nikita Provotorov in pro.cxx
Andrei K
А типов совсем заранее неизвестно сколько?
неа
источник

AK

Andrei K in pro.cxx
Ну тогда земля пухом.
источник

NP

Nikita Provotorov in pro.cxx
😩
источник

IZ

Ilia Zviagin in pro.cxx
Nikita Provotorov
ну CRTP в либе, а мне внезапно динамический полиморфизм понадобился)
Где тут CRTP ?
источник

NP

Nikita Provotorov in pro.cxx
вот
источник