LINUX.ORG.RU

Как объявить две специализации шаблонного класса от одного типа, и что бы компилятор считал их разными типами?

 


1

2

Как объявить две специализации шаблонного класса от одного типа, и что бы компилятор считал их разными типами? Для примера:

typedef MyTmpl<int> MyTp1;
typedef MyTmpl<int> MyTp2;

MyTp1 tp1 = 0;
MyTp2 tp2 = tp1; // что бы это не компилировалось...

Если делать наследование вместо typedef то оно не компилируется, но не работают все определения операторов и прочие ссылки типа MyTmpl в самом классе.

Суть вопроса в том, что мне нужен тип типа идентификатор. Несколько разных идентификаторов, например идентификатор файла FileId, идентификатор объектов Obj1_Id и Obj2_Id, и т.д. Что бы все они поддерживали математические операторы, но что бы между собой их нельзя было напутать присвоить один тип в другой.



Последнее исправление: victor79 (всего исправлений: 1)

Ответ на: комментарий от anonymous

class MyTmp1 : public MyTmpl<int>{}

как я упомянул, в этом случае проблема с унаследованными операторами и методами - они все используют MyTmpl<int> в параметрах, а не MyTmp1.

victor79
() автор топика

Сделай два шаблонных параметра:

template <typename T, typename Tag>
class MyTmpl {
  /* ... */
};

struct TagFile {};
struct TagObj1_Id {};
struct TagObj2_Id {};

using MyTmplFile = MyTmpl<int, TagFile>;
using MyTmplObj1_Id = MyTmpl<int, TagObj1_Id>;
using MyTmplObj2_Id = MyTmpl<int, TagObj2_Id>;

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

Можно упростить:

template <typename T, typename Tag>
class MyTmpl {
  /* ... */
};

using MyTmplFile = MyTmpl<int, struct TagFile>;
using MyTmplObj1_Id = MyTmpl<int, struct TagObj1_Id>;
using MyTmplObj2_Id = MyTmpl<int, struct TagObj2_Id>;

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

так работает, спасибо, вопрос решен.

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