А-а-а-а!!!... Пока пришел с работы домой - вижу, что опоздал к раздаче
Но тем не менее скажу, что хотел, благо хотел весь день
Не вижу никакого криминала в объявлении вида
template<class T,int size>
int sz(T (&arr)[size])
{
return size;
}
В функцию передается именно ссылка на массив размера [size] элементов типа Т, а не на элемент
массива с индексом size. (Вспомните полный аналог - int (*arr)[11] - это ведь указатель на массив
целых размером в 11 штук...)
Решение получилось явно компиляторо-зависимое. Потому что, например gcc 2.95.3 из состава системы
QNX 6.2.1 и gcc 3.3.1 из QNX 6.3.0 "едят" эту задачку, как говорится "не подавившись". А у Finch и
Грома - не работает (что за компилятор?)... 6-го борланда и MSVC 7 у меня нет, проверить не смог, но
LP утверждает, что ведь работает...
У меня все компилируется и работает "на ура" с массивами ЛЮБЫХ типов (на то он и шаблон).
Массивы объявлены, их размеры известны компилятору - нет никаких проблем передать ему ссылку, а она
в данном случае и обязана быть в шаблоне с размером.
Красивое и действительно очень простое решение
Finch, если есть желание копаться с менеджерами памяти и реализациями компиляторов, то по поводу размера
динамического массива - вот, например цитата из "C++ for Real Programmers" Джеффа Элджера...
"В большинстве реализаций C++ оператор new записывает пару скрытых байтов перед возвращаемым адресом.
В этих байтах указывается размер выделенного блока. По ним оператор delete определяет, сколько памяти
за указанным адресом следует освободить."
При желании, видимо, можно покопаться и в этом...
Вышеприведенный код не компилируется в Vc6.0 VC.NET c одинаковыми ошибками.
Еще раз повторяю, если код не собирается то значит в нем ошибка - напиши нормальное решение.
Повторюсь передача в качетсве параметра такого выражения не пройдет если явно не указывать перегрузку приведения типов ИМХО тут.
А вот то, что код в виде форумного не собирается и не соберется в твоем варианте - это не ИМХО - это факт.
Не понял
юмора... А если собирается в чем-то (и не в одном) другом?
Может переписать то в чем не собирается
Шучу, шучу
Хотя, тут на форуме, мне судя по всему шутить надо крайне осторожно
Одна шутка про Ферма чего стоит
Шума - на весь лес
Итак - если вышеприведенный пример работает только в VC.NET то к С он не имеет отношения совершенно никакого. Студия как уже много раз подмечено не соблюдает все стандарты С и кроме того сильно расширяет возможности языка.
А так еще раз повторю -задача некорректна как и метод ее решения тут предлагаемый, это не относится к функциям, это уже немного другой уровень язковых конструкций.
Ну, как выяснилось работает в нескольких разных вариантах. И это хорошо
VC.NET тут нипричем...
А задача и метод решения (на мой взгляд конечно) оригинальны и красивы.
А вот про другой уровень языковых конструкций - двумя руками (и одной ногой) ЗА!!! Шаблоны - это действительно крайне мощный (хотя и опасный иногда) инструмент. Данный пример - тому только в подтверждение...