Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> механизм "улучшенного" typedef 
:(
    Опции темы
Alek86
Дата 29.2.2008, 15:17 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



потребовалось мне написать пару функций со сложной (запутанной) математикой
для того, чтобы компилятор мне высвечивал ошибку, если я в переменную длины случайно запишу значение ширины, решил использовать тайпдефы.
Код

typedef int Length;
typedef int Width;
  Length length = 3;
  Width width = 1;
  length = width;  // ошибка (я думал)

но оказалось, что они такое очень даже позволяют делать

пришлось самому извращаться - писать подобный код:

Код
// чтобы можно было "наследоваться от встроенных типов"
template<typename T>
struct Type {
  Type() {}
  Type(const T& val) : m_val(val) {}
  Type(const Type& var) : m_val(var.m_val) {}
  operator T () {return m_val;}
private:
  T m_val;
};

// наследование
#define TYPEDEF(type_, name_) \
class name_ : public Type<type_> {\
public:\
  name_() {}\
  name_(type_ val) : Type<type_>(val) {}\
  name_(const name_& var) : Type<type_>(var) {}\
};

TYPEDEF(int, Length)
TYPEDEF(int, Width)

// 3 функции для проверки
void func_Len(Length) {}
void func_Wid(Width) {}
void func_Int(int) {}

int main() {
  Length length;
  Width width;
  length = 1;
  length = width;      //error
  width = 2;
  width = length;      //error
  int i_len = length;
  int i_wid = width;
  func_Len(length);
  func_Len(width);      //error
  func_Len(i_len);
  func_Wid(length);      //error
  func_Wid(width);
  func_Wid(i_wid);
  func_Int(length);
  func_Int(width);
  func_Int(i_len);
} 


может есть более стандартное (и распространенное) решение проблемы?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 29.2.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



какая-то надуманная проблема, обычно для этого используют нотацию и прямые руки  smile 
Код

int len_name;//длина
int sz_name;//размер
int ix_name;//индекс

твой подход ухудшает ясность и читаемость))
зы
короче если по каждой мелочи заморачиваться то на программирование времени не останется, а любую идею можно довести до абсурда smile
PM MAIL Skype GTalk   Вверх
Alek86
Дата 29.2.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Lazin @  29.2.2008,  15:43 Найти цитируемый пост)
обычно для этого используют нотацию и прямые руки

как говорится, no comments...


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 29.2.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Вместо изобретения велосипеда лучше сделай нормальную декомпозицию объектов в своем приложении, и твоя математика перестанет быть сложной(запутанной)  smile 
PM MAIL Skype GTalk   Вверх
Alek86
Дата 29.2.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Lazin, спасибо, конечно, за заботу, но вопрос не в том был... как я понял, твой ответ - "нет распространенного решения этой проблемы (так как нет и проблемы)"


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 29.2.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Alek86, ничего не напоминает))
Код

#include <boost/operators.hpp>

#define BOOST_STRONG_TYPEDEF(T, D)                              \
struct D                                                        \
    : boost::totally_ordered1< D                                \
    , boost::totally_ordered2< D, T                             \
    > >                                                         \
{                                                               \
    T t;                                                        \
    explicit D(const T t_) : t(t_) {};                          \
    D(){};                                                      \
    D(const D & t_) : t(t_.t){}                                 \
    D & operator=(const D & rhs) { t = rhs.t; return *this;}    \
    D & operator=(const T & rhs) { t = rhs; return *this;}      \
    operator const T & () const {return t; }                    \
    operator T & () { return t; }                               \
    bool operator==(const D & rhs) const { return t == rhs.t; } \
    bool operator<(const D & rhs) const { return t < rhs.t; }   \
};


PM MAIL Skype GTalk   Вверх
Alek86
Дата 29.2.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



 smile 
вот хош верь, хош не верь, но в бусте первым делом искал...


кстати
Код

#include <boost/strong_typedef.hpp>

BOOST_STRONG_TYPEDEF(int, Length)
BOOST_STRONG_TYPEDEF(int, Width)


// 3 функции для проверки
void func_Len(Length) {}
void func_Wid(Width) {}
void func_Int(int) {}

int main() {
  Length length;
  Width width;
  length = 1;
  length = width;
  width = 2;
  width = length;
}

ошибок не дает :(


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 29.2.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



я сам на этот макрос чисто случайно наткнулся, он нигде в документации не описан

может его не стоит использовать, вдруг в будущих версиях boost его уберут?
PM MAIL Skype GTalk   Вверх
Alek86
Дата 29.2.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



не стоит, ибо он мне не подходит - он чисто explicit конструктор добавляет и все


--------------------
user posted image    user posted image
PM MAIL   Вверх
baldina
Дата 29.2.2008, 17:16 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Alek86, "Улучшенным typedef" твою проблему не решить.
Посмотри в качестве примера это: http://www.boost.org/libs/mpl/doc/tutorial...l-analysis.html
PM MAIL   Вверх
Alek86
Дата 29.2.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



глубоко не вникал, но похоже как раз то, что надо

самому как-то приходилось городить классы Density, Capacity и Weight с зависимосями...

спасибо


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 3.3.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alek86 @  29.2.2008,  18:19 Найти цитируемый пост)
глубоко не вникал, но похоже как раз то, что надо

только как туда вписать Length и Width ты подумал, вот если длину умножить на ширину, это что получится за единица измерения  smile 
PM MAIL Skype GTalk   Вверх
Alek86
Дата 3.3.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



я все еще не разбирался (потребность в этом щас не High Priority) но, думаю, библиотечка должна быть расширяемой
иначе втопку smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ln78
Дата 3.3.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Alek86, или ты при изложении проблемы упростил её до неузнаваемости, или я согласен с Lazin, что проблема надумана. Собственно, смысл венгерской нотации как раз избежание подобных операций наиболее простым и понятным путём. Здесь было обсуждение и ссылка на хорошую статью по этому вопросу.
PM MAIL   Вверх
Alek86
Дата 3.3.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Ln78, не упростил
именно такой typedef мне и нужен. может, та бустовская библиотека мне поможет, может нет

статью читал и согласен на 100% только с примечанием переводчика(программиста). По сути сейчас я спрашиваю о "стандартной" реализации его предложения. А автор, насколько я понял, хочет руками делать то, что можно заставить делать компилятор - это кстати написано в аннотации к библиотеке "Dimensional Analysis" в бусте


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.