Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
1 / 1 / 1
Регистрация: 25.06.2009
Сообщений: 13

Реализация идеомы UniqueType

25.06.2009, 22:12. Показов 1208. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Идея проста и стоит во главе идеологии C++:
C++
1
2
std::string password, login;
unsigned short TCPport, YearOfBirth;
Компилятор запрещает бессмысленные присвоения:
C++
1
login = TCPport; // error
Однако не менее бессмысленные:
C++
1
password = login; TCPport = YearOfBirth; // ok
запретить не может.
Писать класс для каждого подобного типа не реально.
Возникла идея написать шаблон прокси класса:
C++
1
2
3
4
5
6
7
template< class ContainType >class UniqueType{
  ContainType value;
public:
  UniqueType( ContainType value ): value( value ){}
  operator ContainType(){ return value; }
  // При необходимости перегружаем еще что-нибудь.
};
Вопрос как обеспечить уникальность типа.
Очевидное решение слегка не удобно:
C++
1
2
3
template< class ContainType, class Name >class UniqueType;
struct myPasword{}; // каждый раз определять новые бесполезные именные типы
UniqueType< std::string, myPasword > password; // уникальный тип
Пытался сделать так:
C++
1
2
3
template< class ContainType, int n >class UniqueType;
UniqueType< std::string, 1 > password; // уникальный тип
UniqueType< std::string, 2 > login; // уникальный тип
только вместо чисел подставить некий шаблон счетчик,
однако реализовать его не смог Мозг ушел в глубокую рекурсию
Бегло просмотрев кое-что по лиспу, стал подозревать что это не возможно.
Остались вопросы:
1. Как реализовать шаблон UniqueType?
2. Можно ли здесь обойтись без макросов?
3. Возможно ли в принципе реализовать шаблон счетчик или иной генератор?
4. Кто-нибудь где-нибудь встречался с подобной идеомой?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2009, 22:12
Ответы с готовыми решениями:

Реализация AND и OR
Данные программы необходимо реализовать на Scheme (диалекте LISP). ВАЖНОЕ УСЛОВИЕ: При выполнении заданий не используйте...

Реализация
Такое через радио инпут делать или как? в первый раз такую штуку делаю

Реализация ЛС
Добрый день, нужна помощь. Начинаю делать Личные сообщения. Стразу возникает вопрос. Как достать все значения из БД и поместить их в...

5
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
27.06.2009, 18:53
Скажи, что бессмысленного в присвоениии значения одной переменой другой?
Компилятор вполне осмысленно запрещает тебе присвоение значения одного типа переменной совершенно иного. Это предупреждает неопределенность в поведении программы и обращает внимание программиста на то, что он нифига не указал, че сделать хочет.
То, что хочешь сделать ты, я тоже слабо понимаю.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.06.2009, 19:03
Из-за проблем с форумом часть постов похерилась. В общем, ему нужны типы, которые логически бы означали разные вещи. Что-то типа "typedef int aaa_t; typedef int bbb_t;" но при этом чтобы переменную типа aaa_t (которая, например означает килограммы), нельзя было присвоить в перменную типа bbb_t (которая означает километры).

rs4i, кроме черезж$пного способа, до которого ты уже и сам додумался (шаблон от двух типов, один из которых фиктивный, но уникальный), вроде бы больше ниикак не сделать
0
1 / 1 / 1
Регистрация: 25.06.2009
Сообщений: 13
29.06.2009, 08:04  [ТС]
Найден вот такой подход:
template< class T, int > class UniqueType{ /**/ };
UniqueType< std::string, __LINE__ > login = "rs4i";
UniqueType< std::string, __LINE__ > pass = "******";
login = pass; // error
Все это легко оборачиваеться в макрос.
Выглядеть будет приблизительно так:
MacroUniqueType( std::string ) login = "rs4i";
Это не совсем коректно, так как, в разных файлах на одинаковый по номеру строках можно создать одинаковые типы.

Добавлено через 28 минут 25 секунд
еще тему нарыл:
http://rsdn.ru/forum/cpp/2337981.aspx
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.06.2009, 10:03
Ты уверен, что такой многоэтажный геморрой стОит того, чтобы с ним связываться?
0
1 / 1 / 1
Регистрация: 25.06.2009
Сообщений: 13
29.06.2009, 12:36  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Ты уверен, что такой многоэтажный геморрой стОит того, чтобы с ним связываться?
Не уверен. Более того, думаю что не стоит.
Код счетчика
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
static const int max = 498;
char engine( ... );
template< int I >struct number: public number< I - 1 >{};
template<>struct number< 0 >{};
template< int id = sizeof( engine( number< max >() ) ) >struct counter{
    friend char( &engine( number< id + 1 > ) )[ id + 1 ];
    static const int val = id - 1;
};
 
int main(){
    std::cout << counter<>::val << std::endl; // 0
    std::cout << counter<>::val << std::endl; // 1
    std::cout << counter<>::val << std::endl; // 2
    return 0;
}
Под VС9 больше 498 не считает, а под GCC не работает.
Решение конечно интересное .. но .. похоже бесполезное.
Еще не вечер. Может нарою еще что.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2009, 12:36
Помогаю со студенческими работами здесь

Реализация
Есть меню слик слайдера Первый пункт должен быть font-size: 18 пикс и так увеличиваться до punkt_active снизу все также, только уже...

Реализация if-else
Привет всем, задачка вроде не сложная, но никак не могу к ней подступиться. Пишу скрипт. В скрипт передается параметр идентификатор...

Реализация БД в MO
Здравствуйте форумчане! :) Имеется таблица с данными. Хотелось бы , чтобы при открытии документа выскакивало окошко , где можно было бы...

Реализация на C#
Как в C# работать с WinAPI? Например, я пишу hwnd h = FindWindow(nil,'Безымянный - Блокнот'); утверждает, что нет такой функции. Какой...

Реализация
Кто может помочь с одним моментом в курсовике , курсовик сделан почти весь, но там буквально 5-7 строчек кода нужно чтобы всё заработало. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru