ОБСУЖДЕНИЕ

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

3 ответов 3,9 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Идея проста и стоит во главе идеологии 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
 
вот и поговорили ..
 
Тема мной не закрыта.
Уже есть несколько кривоватых решений,
и некоторое количество идей.
Идеи в разработке.
Если кому интересно, дайте знать, я поделюсь.
А так .. больше постить не буду.
Чао.
 
Статус
Закрыто для дальнейших ответов.