LINUX.ORG.RU

Есть ли способ получить текстовое представление специализации шаблона? Или как-либо его идентифицировать.

 


0

2

Есть ли способ получить текстовое представление специализации класса? Для целей контроля при повторых использованиях, что второй раз за тем же идентификатором запрашивается таже специализация класса. Или как можно как-либо по другому это проконтролировать?

Для примера, пусть будет простой базовый класс A с виртуальными методами, от него наследую шаблонный класс B. При использованнии делаю new B<SomeType> шаблонного класса и указатели таких классов сохраняю в std::map<string,A*> - где string это глобальный идетификатор.

Что-то вроде:

std::map<string,A*> global_map;

A* get_global_prop<SomeType>(const string& id) {

   A*& cell = global_map[id];

   if (cell != nullptr) {
      // здесь контроль, что в прошлый раз была таже специализация
      assert( ... );
      return cell;
   }

   return cell = static_cast<A*>(new B<SomeType>);
}

Чуть погодя пришло такое решение на ум:

int& global_counter() {
   static int r = 0;
   return r;
}

template <class T>
int global_template_ident() {
   static int r = ++global_counter();
   return r;
}

позже получать его в базовом через виртуальный метод и проверять

   template <class T>
   struct B : public A {
      int template_ident() override {
          return global_template_ident<T>() }
   };

   ...
   A* r = ...;
   assert( r->template_ident() == global_template_ident<T>() );

Есть ли у такого метода недостатки или что другое будет лучше?

victor79
() автор топика
Последнее исправление: victor79 (всего исправлений: 1)
Ответ на: комментарий от xaizek

Можно аналогичным образом возвращать std::type_info.

Ну да, так существенно лучше. Совсем без global_template_ident.

На оператор typeid я до сих пор не обращал внимания. Спасибо.

victor79
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.