Представьте себе оператор countof (по аналогии с sizeof), который возвращает количество элементов в какой-то составной сущности.
Для массивов в С/С++ этот оператор часто реализуют в виде макроса
Но кроме массивов, есть еще много составных сущностей в разных языках программирования.
И вот тут начинаются вопросы. А что считать элементами структуры, класса и т.д.?
Для примитивных типов логично чтобы этот оператор возвращал ноль.
Для перечислений — количество элементов в перечислении (это бывает полезно).
Для структур и классов... тут начинается самое интересное.
С одной стороны, можно подсчитывать количество именованных полей данных.
С другой — количество имен внутри пространства имен, образуемого классом. А ведь там могут быть и вложенные классы, и статические поля, и методы, и статические методы, и всякие свойства, и т.д. Еще — как учитывать поля родительских классов при наследовании (ИМХО учитывать). Еще — учитывать ли скрытые поля, генерируемые компилятором (ИМХО тоже учитывать).
То есть в это количество будут входить получаются совершенно разные сущности.
Тем ни менее, при наличии развитой рефлексии и макросов времени компиляции такой оператор мог бы быть полезен.
В общем, я иногда задумываюсь над тем, как бы мог быть реализован подобный оператор. Интересно ваше мнение.
Думаю, ни для чего кроме статических массивов этот оператор не должен быть применим. Он используется для цикла. Что за цикл по полям структуры? Не бывает такого. С енумом тоже не то, если и делать, то с другим именем.
Здравствуйте, vsb, Вы писали:
vsb>Думаю, ни для чего кроме статических массивов этот оператор не должен быть применим. Он используется для цикла. Что за цикл по полям структуры? Не бывает такого. С енумом тоже не то, если и делать, то с другим именем.
"Не бывает" это не совсем так. Цикл по полям структуры во время комиляции (в синтаксическом макросе) запросто возможен. Цикл во время выполнения — чуть сложнее, но тоже возможен (с привлечением полиморфизма например).
Применение — первое что приходит на ум — сериализация структур в xml/json.
Здравствуйте, DenisCh, Вы писали:
vsb>> Что за цикл по полям структуры? Не бывает такого.
DC>Для каждого _поле из мСтруктура Цикл DC> сообщить(_поле.Имя); DC>КонецЦикла;
Здравствуйте, vsb, Вы писали:
vsb> vsb>> Что за цикл по полям структуры? Не бывает такого.
vsb> DC>Для каждого _поле из мСтруктура Цикл vsb> DC> сообщить(_поле.Имя); vsb> DC>КонецЦикла; vsb> Это foreach, count тут не нужен.
Для сч = 0 по мСтруктура.Количество() — 1 Цикл
сообщить(мСтруктура[сч];
КОнецЦикла;
Здравствуйте, vsb, Вы писали:
vsb>Думаю, ни для чего кроме статических массивов этот оператор не должен быть применим. Он используется для цикла. Что за цикл по полям структуры? Не бывает такого. С енумом тоже не то, если и делать, то с другим именем.
Будущее уже наступило:
import std.stdio, std.traits;
struct Message {
int id;
string str;
bool urgent;
}
void main() {
auto m = Message(34, "hello", false);
alias Names = FieldNameTuple!Message;
writeln("count: ", Names.length);
foreach(name; Names)
writeln("field ", name, " = ", __traits(getMember, m, name));
}
выводит
count: 3
field id = 34
field str = hello
field urgent = false
(просто хотелось похвастать возможностями языка D )
Здравствуйте, x-code, Вы писали:
XC>Представьте себе оператор countof (по аналогии с sizeof), который возвращает количество элементов в какой-то составной сущности.
Любые дизайн-решения нужно начинать со сценариев использования.
Если сценарий покрывает достаточно частый случай и его реализация лучше, чем альтернативы — то можно хотя бы обсуждать такую штуку.
Без сценариев разговор беспредметен — этот оператор ничуть не лучше оператора stdevof(), который возвращает стандартное отклонение размеров (sizeof) всех компонентов составной сущности, побитово приведённое из double в int64.
Для массивов он, разумеется, возвращает 0. Почему бы не подумать о том, как мог бы быть реализован такой оператор?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.