реализация идеомы Uniquetype

  • Автор темы Автор темы rs4i
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
R

rs4i

Идея проста и стоит во главе идеологии C++:
Код:
std::string password, login;
unsigned short TCPport, YearOfBirth;
Компилятор запрещает бессмысленные присвоения:
Код:
login = TCPport; // error
Код:
Однако не менее бессмысленные:
password = login; TCPport = YearOfBirth; // ok
запретить не может.
Писать класс для каждого подобного типа не реально.
Возникла идея написать шаблон прокси класса:
Код:
template< class ContainType >class UniqueType{
ContainType value;
public:
UniqueType( ContainType value ): value( value ){}
operator ContainType(){ return value; }
// При необходимости перегружаем еще что-нибудь.
};
Вопрос как обеспечить уникальность типа.
Очевидное решение слегка не удобно:
Код:
template< class ContainType, class Name >class UniqueType;
struct myPasword{}; // каждый раз определять новые бесполезные именные типы
UniqueType< std::string, myPasword > password; // уникальный тип
Пытался сделать так:
Код:
template< class ContainType, int n >class UniqueType;
UniqueType< std::string, 1 > password; // уникальный тип
UniqueType< std::string, 2 > login; // уникальный тип
только вместо чисел подставить некий шаблон счетчик,
однако реализовать его не смог :lol: Мозг ушел в глубокую рекурсию :D
Остались вопросы:
1. Как реализовать шаблон UniqueType?
2. Можно ли здесь обойтись без макросов?
3. Возможно ли реализовать (уже дело принципа) шаблон счетчик?
Прошу высказать любые соображения по теме.
 
Пока есть следующий макрушный вариант:
Код:
template< class ContainType, class TypeName >class UniqueType{
ContainType v;
public:
UniqueType( ContainType c ): v( c ){}
operator ContainType(){ return v; }
};

#define TypedefUniqueType( ContainType, TypeName )\
struct MACRO__##TypeName{};\
typedef UniqueType< ContainType, MACRO__##TypeName > TypeName

TypedefUniqueType( std::string, PasswordType );
PasswordType password; // уникальный тип

TypedefUniqueType( std::string, LoginType );
LoginType login; // уникальный тип

login = password; // error
 
Тема мной не закрыта.
Уже есть несколько кривоватых решений,
и некоторое количество идей.
Идеи в разработке.
Если кому интересно, дайте знать, я поделюсь.
А так .. больше постить не буду.
Чао.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!