Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 343 344 [345] 346 347 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5161
,
|
|
|
|
Вы смогли бы написать ![]() ![]() foreach(var w in words) words_count[w]++; только вместо int пришлось бы юзать какой-нибудь int-box |
|
Сообщ.
#5162
,
|
|
|
|
korvin, т.е. вы либо думать не хотите, либо просто дурачка включили.
В таком случае класс словаря был бы описан как-то так ![]() ![]() class Dictionary<TKey, TValue> where TValue : new() Естественно, это слишком жёсткое ограничение. Так что fail. |
|
Сообщ.
#5163
,
|
|
|
|
Цитата MyNameIsIgor @ korvin, т.е. вы либо думать не хотите, либо просто дурачка включили. В таком случае класс словаря был бы описан как-то так ![]() ![]() class Dictionary<TKey, TValue> where TValue : new() Естественно, это слишком жёсткое ограничение. Так что fail. чего? какое еще ограничение? |
|
Сообщ.
#5164
,
|
|
|
|
Цитата korvin @ чего? какое еще ограничение? Ну, а как вы собрались создавать пару, не гарантировав компилятору, что у TValue есть конструктор по умолчанию? |
|
Сообщ.
#5165
,
|
|
|
|
Вы можете нормально объяснить, в чем у Вас проблема?
|
|
Сообщ.
#5166
,
|
|
|
|
Цитата korvin @ Вы можете нормально объяснить, в чем у Вас проблема? Напишите работающий дженерик вида![]() ![]() template<class T> class A { public: T foo() { return T(); } }; И да, я объясняю нормально. Не желающие понимать могут проваливать - я никого не держу. |
|
Сообщ.
#5167
,
|
|
|
|
Цитата MyNameIsIgor @ Естественно, это слишком жёсткое ограничение. Так что fail. Но если нужно - можно сделать соответствующий, специализированный словарь, с таким вот ограничением. У вас ведь ++ тоже не для всех специализаций работает. |
|
Сообщ.
#5168
,
|
|
|
|
Цитата IL_Agent @ Но если нужно - можно сделать соответствующий, специализированный словарь, с таким вот ограничением. Что неудобно. Цитата IL_Agent @ У вас ведь ++ тоже не для всех специализаций работает. А здесь нет никаких специализаций. |
|
Сообщ.
#5169
,
|
|
|
|
Цитата MyNameIsIgor @ Ну, а как вы собрались создавать пару, не гарантировав компилятору, что у TValue есть конструктор по умолчанию? пусть этим занимается хеш ![]() ![]() abstract class MyHashMap<K, V> extends HashMap<K, V> { abstract protected V makeDefault(); public V get(K key) { if(containsKey(key)) { return super.get(key); } else { V value = makeDefault(); put(key, value); return value; } } } public class MyHashMapTest { public static void main(String[] args) { Map<String, Integer> map = new MyHashMap<>() { protected Integer makeDefault() { return 0; } }; } } Добавлено можно даже так: ![]() ![]() interface Factory<A> { A make(); } class IntegerFactory implements Factory<Integer> { public Integer make() { return 0; } } class MyHashMap<K, V, F extends Factory<V>> extends HashMap<K, V> { private final F factory; public MyHashMap(F factory) { this.factory = factory; } public V get(K key) { if(containsKey(key)) { return super.get(key); } else { V value = factory.make(); put(key, value); return value; } } } public class MyHashMapTest { public static void main(String[] args) { Map<String, Integer> map = new MyHashMap<>(new IntegerFactory()); } } Добавлено Цитата MyNameIsIgor @ Напишите работающий дженерик вида![]() ![]() template<class T> class A { public: T foo() { return T(); } }; И да, я объясняю нормально. Не желающие понимать могут проваливать - я никого не держу. гарантия наличия конструкторов по-умолчанию не имеет отношения к дженерикам/шаблонам. если б джава давала такие гарантии, то и проблемы с написанием такого дженерика не было б вообще никаких. |
|
Сообщ.
#5170
,
|
|
|
|
Цитата korvin @ пусть этим занимается хеш И где реализация метода abstract protected V makeDefault() ? Цитата korvin @ гарантия наличия конструкторов по-умолчанию не имеет отношения к дженерикам/шаблонам. Имеет. Дженериком нужна такая гарантия. Шаблонам она не нужна пока мы об этом не попросим. Цитата korvin @ если б джава давала такие гарантии, то и проблемы с написанием такого дженерика не было б вообще никаких. Шарп может дать. Но подобный словарь был бы ущербным. Добавлено Цитата korvin @ можно даже так: Матерь Божья, как же много слов... |
|
Сообщ.
#5171
,
|
|
|
|
Цитата MyNameIsIgor @ И где реализация метода abstract protected V makeDefault()? ![]() ![]() Map<String, Integer> map = new MyHashMap<>() { protected Integer makeDefault() { return 0; } // <- вот же }; |
|
Сообщ.
#5172
,
|
|
|
|
Как это мило, задавать для каждого словаря фабрику или метод создания Value
|
|
Сообщ.
#5173
,
|
|
|
|
Цитата MyNameIsIgor @ Имеет. Дженериком нужна такая гарантия. Шаблонам она не нужна пока мы об этом не попросим. чего бы это вдруг она им нужна? и как обычно в C++ придется писать обертку, если у нужного нам класса нет конструктора по-умолчанию |
|
Сообщ.
#5174
,
|
|
|
|
Цитата korvin @ чего бы это вдруг она им нужна? Потому что они компилируются сразу в код, а не инстанцируются для аргументов. Цитата korvin @ и как обычно в C++ придется писать обертку, если у нужного нам класса нет конструктора по-умолчанию Только если мы захотим использовать индексацию. Если не захотим, то не используем - и всё работает. |
|
Сообщ.
#5175
,
|
|
|
|
Цитата MyNameIsIgor @ Как это мило, задавать для каждого словаря фабрику или метод создания Value ![]() зачем для каждого? если вам не на один раз, опишите класс ![]() ![]() class MyIntegerHashMap<K> extends MyHashMap<K, Integer> { protected Integer makeDefault() { return 0; } } опять надуманные проблемы? Добавлено Цитата MyNameIsIgor @ Шарп может дать. Но подобный словарь был бы ущербным. почему же ущербным? Цитата MyNameIsIgor @ Матерь Божья, как же много слов... это делается один раз и навсегда, как я уже говорил, это могло бы быть вшито в стандартный HashMap, но авторы видимо посчитали это излишеством. |