Здравствуйте, x-code, Вы писали:
XC>Представьте себе оператор countof (по аналогии с sizeof), который возвращает количество элементов в какой-то составной сущности.
Любые дизайн-решения нужно начинать со сценариев использования.
Если сценарий покрывает достаточно частый случай и его реализация лучше, чем альтернативы — то можно хотя бы обсуждать такую штуку.
Без сценариев разговор беспредметен — этот оператор ничуть не лучше оператора stdevof(), который возвращает стандартное отклонение размеров (sizeof) всех компонентов составной сущности, побитово приведённое из double в int64.
Для массивов он, разумеется, возвращает 0. Почему бы не подумать о том, как мог бы быть реализован такой оператор?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Думаю, ни для чего кроме статических массивов этот оператор не должен быть применим. Он используется для цикла. Что за цикл по полям структуры? Не бывает такого. С енумом тоже не то, если и делать, то с другим именем.
Здравствуйте, 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 )
Представьте себе оператор countof (по аналогии с sizeof), который возвращает количество элементов в какой-то составной сущности.
Для массивов в С/С++ этот оператор часто реализуют в виде макроса
Но кроме массивов, есть еще много составных сущностей в разных языках программирования.
И вот тут начинаются вопросы. А что считать элементами структуры, класса и т.д.?
Для примитивных типов логично чтобы этот оператор возвращал ноль.
Для перечислений — количество элементов в перечислении (это бывает полезно).
Для структур и классов... тут начинается самое интересное.
С одной стороны, можно подсчитывать количество именованных полей данных.
С другой — количество имен внутри пространства имен, образуемого классом. А ведь там могут быть и вложенные классы, и статические поля, и методы, и статические методы, и всякие свойства, и т.д. Еще — как учитывать поля родительских классов при наследовании (ИМХО учитывать). Еще — учитывать ли скрытые поля, генерируемые компилятором (ИМХО тоже учитывать).
То есть в это количество будут входить получаются совершенно разные сущности.
Тем ни менее, при наличии развитой рефлексии и макросов времени компиляции такой оператор мог бы быть полезен.
В общем, я иногда задумываюсь над тем, как бы мог быть реализован подобный оператор. Интересно ваше мнение.
Здравствуйте, DenisCh, Вы писали:
vsb>> Что за цикл по полям структуры? Не бывает такого.
DC>Для каждого _поле из мСтруктура Цикл DC> сообщить(_поле.Имя); DC>КонецЦикла;
Здравствуйте, vsb, Вы писали:
vsb>Думаю, ни для чего кроме статических массивов этот оператор не должен быть применим. Он используется для цикла. Что за цикл по полям структуры? Не бывает такого. С енумом тоже не то, если и делать, то с другим именем.
"Не бывает" это не совсем так. Цикл по полям структуры во время комиляции (в синтаксическом макросе) запросто возможен. Цикл во время выполнения — чуть сложнее, но тоже возможен (с привлечением полиморфизма например).
Применение — первое что приходит на ум — сериализация структур в xml/json.
Здравствуйте, vsb, Вы писали:
vsb> vsb>> Что за цикл по полям структуры? Не бывает такого.
vsb> DC>Для каждого _поле из мСтруктура Цикл vsb> DC> сообщить(_поле.Имя); vsb> DC>КонецЦикла; vsb> Это foreach, count тут не нужен.
Для сч = 0 по мСтруктура.Количество() — 1 Цикл
сообщить(мСтруктура[сч];
КОнецЦикла;