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

Тема в разделе "Общие вопросы по С и С++", создана пользователем rs4i, 25 июн 2009.

Статус темы:
Закрыта.
  1. rs4i

    rs4i Гость

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

    rs4i Гость

    Пока есть следующий макрушный вариант:
    Код (Text):
    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
     
  3. rs4i

    rs4i Гость

    вот и поговорили ..
     
  4. rs4i

    rs4i Гость

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

Поделиться этой страницей