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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi - приемущества и недостатки, принимаются различные высказывания 
:(
    Опции темы
MAKCim
Дата 29.1.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Romikgy @  29.1.2007,  16:53 Найти цитируемый пост)
MAKCim, и ты хочешь сказать что это все просто для понимания?

нет
Цитата(Romikgy @  29.1.2007,  16:53 Найти цитируемый пост)
объясни плз, раньше я такого не видал просто

static функция-шаблон класса, точнее ее объявление
в качестве параметра выступает указатель на функцию-член класса С
что конкретно не понятно?



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.1.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(MAKCim @  29.1.2007,  16:03 Найти цитируемый пост)
в качестве параметра выступает указатель на функцию-член класса С

это


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MAKCim
Дата 29.1.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Romikgy @  29.1.2007,  18:09 Найти цитируемый пост)
это 

и что? тот же самый callback, только + объект
Код

class A {
public:
    void F(int a) {}
};

int main() {
    A *a = new A;
    void (A :: *pointer)(int) = &A :: F;
    (a ->* pointer)(100);
    return 0;
}


Это сообщение отредактировал(а) MAKCim - 29.1.2007, 18:46


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.1.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



ну в этом контексте

Цитата(MAKCim @  29.1.2007,  17:39 Найти цитируемый пост)
class A {
public:
    void F(int a) {}
};
int main() {
    A *a = new A;
    void (A :: *pointer)(int) = &A :: F;
    (a ->* pointer)(100);
    return 0;
}

смысл понятен, а здесь нет smile

Цитата(MAKCim @  29.1.2007,  13:10 Найти цитируемый пост)
 template<class C> static T1 what(int C::*);

как внутри этого метода можно узнать на что указывает этот указатель?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MAKCim
Дата 29.1.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Romikgy @  29.1.2007,  19:24 Найти цитируемый пост)
как внутри этого метода можно узнать на что указывает этот указатель? 

здесь смысл не в этом
Код

enum {value = sizeof(is_class<T> :: what<T>(0)) == sizeof(T1) };

sizeof() направлен на размер типа возвращаемого одной из функций what() значения
если T - класс, то преобразование 0 в указатель на функцию-член этого класса приоритетнее преобразования к элипсису (...), при этом для sizeof() не важно, есть ли вообще в классе методы, ему важен сам факт выбора компилятором нужной функции, а значит типа возвращаемого значения, а значит размера, т. е в данном случае указатель на функцию-член используется как инвариант принадлежности типа Т к типу класса, потому как тип "указатель на функцию-член" свойственен только классам/структурам
Компилятор "ленив", он не проверяет в данном случае, а законно ли вообще преобразование 0 -> int C::*
если T - класс, то ему этого в данном случае хватает



Это сообщение отредактировал(а) MAKCim - 29.1.2007, 20:48


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.1.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(MAKCim @  29.1.2007,  19:42 Найти цитируемый пост)
sizeof() направлен на размер типа возвращаемого одной из функций what() значения
если T - класс, то преобразование 0 в указатель на функцию-член этого класса приоритетнее преобразования к элипсису (...), при этом для sizeof() не важно, есть ли вообще в классе методы, ему важен сам факт выбора компилятором нужной функции, а значит типа возвращаемого значения, а значит размера, т. е в данном случае указатель на функцию-член используется как инвариант принадлежности типа Т к типу класса, потому как тип "указатель на функцию-член" свойственен только классам/структурам

ответь мне на один вопрос, где вся эта лабуда применяется? (именно в том виде как ты привел пример)

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 29.1.2007, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(likehood @  29.1.2007,  17:02 Найти цитируемый пост)
Совсем не обязательно неявный интерфейс усложняет разработку. 

  Когда я говорил усложняет, то имел ввиду с академической точки зрения. А на счет встроенных типов тут у меня такое убеждение, что шаблоны лишние. Для встроенных все должно быть максимально оптимизировано. Универсальность <> скорость. Так было всегда. Универсальность это использование общих моментов т.е. компромис, который определяется правилом, чтобы  лучше было всем вместе, но не одному в ущерб другого. Для встроенных типов нужно максимум скорости, потому никакие компромисы не допустимы. Встроенные должны иметь свой набор классов и методов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 29.1.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

ответь мне на один вопрос, где вся эта лабуда применяется?

ооо, это непростой вопрос  smile, честно, я сам не видел ни одного реального проекта, где бы это применялось  smile 
может Daevaorn знает
Цитата

но вот такого чуда.... я просто не представляю где оно может понадобится!

ну в принципе, т. к я отвечал на пост Alexeis, это дело можно использовать для проверки ограничений, накладываемых на тип в шаблоне, т. е, например, если тип T - класс, то отнаследоваться от него, если нет - сделать что-то другое
Цитата

и второе хотелось бы  полностью разобраться хотя бы в твоей фразе

ну смотри
sizeof() используется для определения различных размеров (типов, переменных и пр.)
Код

sizeof(is_class<T> :: what<T>(0))

is_class<T> :: what<T>(0) - это как бы вызов функции, но в контексте sizeof() это не вызов функции, а определение размера типа возвращаемого ею значения, т. е либо sizeof(T1), либо sizeof(T2), смотря какую функцию выбере компилятор здесь
Код

sizeof(is_class<T> :: what<T>(0))

функций what() у нас в классе 2, соответственно компилятор может выбрать или
what(...), или what(int C::*)
в этом месте идет разрешение перегрузки на основании переданного значения, т. е нуля
0 может преобразоваться в принципе и в ..., и в int C::*, но это в принципе
реально он может преобразоваться в int C::* только тогда, когда C (а значит T) - класс, потому как указатель на функцию-член - это фича только классов/структур, в ... 0 может преобразоваться всегда
компилятор в курсе, что за тип такой С (класс или что-то еще) и исходя из этого выбирает функцию
выбрав функцию, становится понятен тип возвращаемого ею значения, а значит размер, что и возвращает sizeof()
Romikgy
проще не могу  smile

Добавлено @ 21:19 
Alexeis, 
Цитата

Когда я говорил усложняет, то имел ввиду с академической точки зрения. А на счет встроенных типов тут у меня такое убеждение, что шаблоны лишние. Для встроенных все должно быть максимально оптимизировано.

Вот тут ты не прав
Как раз тут мы только выигрываем от шаблонов, потому как вся сложность ложится на компилятор, а не на процессор в итоге
Цитата

Встроенные должны иметь свой набор классов и методов.

 smile 
вектор int-ов, long-ов, short-ов, ...



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Beltar
Дата 29.1.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 7



Цитата

Попутно возникает вопрос к Beltar'у: вот ты говоришь, что вместо шаблонов можно использовать средства IDE, а как ты себе представляешь реализацию всего этого?


А так и представляю. Вставить нужный код в текст поменяв названия типов на нужный. Вот и все. Типовая задача. Нах. У меня есть структура хранения данных (взял из реального проектика)

Код

  TTask=class
  public
    PopUp:boolean;
    PlaySound:boolean;
    Shedule:boolean;
    Days:TWeekDays;
    ShTime:TTime;
    used:TDate;
    Appl:ShortString;
    Param:ShortString;
    WakeTime:TDateTime;
    Msg:ShortString;
    constructor Create;
  end;


Хранить в TList я ее не хочу, т. к. надо каждый раз приводить типы. Делаю так:

Код

interface;
//...
  TTaskList=class(TList)
  private
  protected
    function Get(Index: Integer): TTask;
    procedure Put(Index: Integer; Item: TTask);
  public
    property Items[Index: Integer]: TTask read Get write Put; default;
    function Add(Item: TTask): Integer;
    procedure Delete(Index: Integer);
    function First: TTask;
    function IndexOf(Item: TTask): Integer;
    procedure Insert(Index: Integer; Item: TTask);
    function Last: TTask;
    function Remove(Item: TTask): Integer;
    constructor Create;
    destructor Destroy;
  end;
//...
implementation

function TTaskList.Add(Item: TTask): Integer;
begin
Result:=inherited Add(Item);
end;

constructor TTaskList.Create;
begin
inherited;
end;

procedure TTaskList.Delete(Index: Integer);
begin
inherited
end;

destructor TTaskList.Destroy;
begin
inherited;
end;

function TTaskList.First: TTask;
begin
Result:=TTask(inherited First)
end;

function TTaskList.Get(Index: Integer): TTask;
begin
Result:=TTask(inherited Get(Index))
end;

function TTaskList.IndexOf(Item: TTask): Integer;
begin
Result:=inherited IndexOf(Item);
end;

procedure TTaskList.Insert(Index: Integer; Item: TTask);
begin
Inherited Insert(Index,Item);
end;

function TTaskList.Last: TTask;
begin
Result:=TTask((inherited Last))
end;

procedure TTaskList.Put(Index: Integer; Item: TTask);
begin
Inherited Put(Index,Item);
end;

function TTaskList.Remove(Item: TTask): Integer;
begin
Result:=inherited Remove(Item);
end;


Трачу на эту хреновину 5 минут. Допустим мне нужно еще какой-то контейнер. Я могу его сделать простым копи-пастом с заменой. Но можно это дело автоматизировать. И даже ввести стандартную заготовку наследника от TList, т. е. шаблон. Это вполне можно возложить на IDE.
Это реальный пример, куда более реальный, чем все надуманные примеры, которые тут рисует MAKCim. Этого мне будет совершенно достаточно.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
MAKCim
Дата 29.1.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Я могу его сделать простым копи-пастом
Но можно это дело автоматизировать. И даже ввести стандартную заготовку наследника от TList, т. е. шаблон

 smile  smile 
я только не вижу разницы тогда между тем, что ты предлагаешь и шаблонами С++ (кроме, конечно, реализации этого в IDE  smile )

Это сообщение отредактировал(а) MAKCim - 29.1.2007, 21:47


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Daevaorn
Дата 29.1.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 5
Всего: 70



Цитата(MAKCim @  29.1.2007,  22:14 Найти цитируемый пост)
может Daevaorn знает

догадываюсьsmile это всё применяется для имитации идиомы "contract programming". Поскольку встроенных возможностей заранее оговорить обязательный интерфес типа в С++ нет, поэтому приходится прибегать к помощи, в частности, static_if. Сей метод популярен у разработчиков библиотек, которые хотят ещё на начальном этапе определить "форму" клиентского кода. Иногда бывает полезно и избаляет от неожиданностей. 
Ещё совсем недавно нам обещали, что в следующем стнадарте С++ будет эта вещь реализована. Да ещё и с более широкими возможностями( например с пре/пост условиями для функций и т.д.). Но почему-то пока от этого отказалисьsmile
Цитата(Beltar @  29.1.2007,  22:30 Найти цитируемый пост)
Трачу на эту хреновину 5 минут. 

поздравляюsmile всё что ты делаешь и так можно реализовать при помощи встроенного в Delphi препроцессора уже сейчас.

Это сообщение отредактировал(а) Daevaorn - 29.1.2007, 21:50
PM MAIL WWW   Вверх
MAKCim
Дата 29.1.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Это реальный пример, куда более реальный, чем все надуманные примеры, которые тут рисует MAKCim

да уж, реальнее некуда
ваш класс + copy-paste = индусский метод программирования

Это сообщение отредактировал(а) MAKCim - 29.1.2007, 21:51


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



MAKCim, может это и круто, но мне жалко свой моск  smile . Просто ужасный синтаксис. Ни какого желания это учить  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 29.1.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Alexeis @  29.1.2007,  22:33 Найти цитируемый пост)
MAKCim, может это и круто, но мне жалко свой моск  smile . Просто ужасный синтаксис. Ни какого желания это учить

да ради бога, никто не принуждает  smile 
это нужно либо понять, либо забыть как страшный сон  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.1.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(MAKCim @  29.1.2007,  20:14 Найти цитируемый пост)
проще не могу

Спасибо и на этом smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Страницы: (59) « Первая ... 55 56 [57] 58 59 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




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


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

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