Оператор countof
От: x-code  
Дата: 08.03.19 17:25
Оценка: -1
Представьте себе оператор countof (по аналогии с sizeof), который возвращает количество элементов в какой-то составной сущности.
Для массивов в С/С++ этот оператор часто реализуют в виде макроса
#define _countof(array) (sizeof(array) / sizeof(array[0]))

Но кроме массивов, есть еще много составных сущностей в разных языках программирования.

И вот тут начинаются вопросы. А что считать элементами структуры, класса и т.д.?
Для примитивных типов логично чтобы этот оператор возвращал ноль.
Для перечислений — количество элементов в перечислении (это бывает полезно).

Для структур и классов... тут начинается самое интересное.
С одной стороны, можно подсчитывать количество именованных полей данных.
С другой — количество имен внутри пространства имен, образуемого классом. А ведь там могут быть и вложенные классы, и статические поля, и методы, и статические методы, и всякие свойства, и т.д. Еще — как учитывать поля родительских классов при наследовании (ИМХО учитывать). Еще — учитывать ли скрытые поля, генерируемые компилятором (ИМХО тоже учитывать).
То есть в это количество будут входить получаются совершенно разные сущности.
Тем ни менее, при наличии развитой рефлексии и макросов времени компиляции такой оператор мог бы быть полезен.

В общем, я иногда задумываюсь над тем, как бы мог быть реализован подобный оператор. Интересно ваше мнение.
Re: Оператор countof
От: vsb Казахстан  
Дата: 08.03.19 17:32
Оценка: +2
Думаю, ни для чего кроме статических массивов этот оператор не должен быть применим. Он используется для цикла. Что за цикл по полям структуры? Не бывает такого. С енумом тоже не то, если и делать, то с другим именем.
Re[2]: Оператор countof
От: x-code  
Дата: 08.03.19 17:42
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Думаю, ни для чего кроме статических массивов этот оператор не должен быть применим. Он используется для цикла. Что за цикл по полям структуры? Не бывает такого. С енумом тоже не то, если и делать, то с другим именем.


"Не бывает" это не совсем так. Цикл по полям структуры во время комиляции (в синтаксическом макросе) запросто возможен. Цикл во время выполнения — чуть сложнее, но тоже возможен (с привлечением полиморфизма например).
Применение — первое что приходит на ум — сериализация структур в xml/json.
Re[2]: Оператор countof
От: DenisCh Россия  
Дата: 09.03.19 07:01
Оценка:
Здравствуйте, vsb, Вы писали:

vsb> Что за цикл по полям структуры? Не бывает такого.


Для каждого _поле из мСтруктура Цикл
сообщить(_поле.Имя);
КонецЦикла;
[url=https://github.com/abbat/avalon1.0.449[/url]
Re[3]: Оператор countof
От: vsb Казахстан  
Дата: 09.03.19 07:12
Оценка: +1
Здравствуйте, DenisCh, Вы писали:

vsb>> Что за цикл по полям структуры? Не бывает такого.


DC>Для каждого _поле из мСтруктура Цикл

DC> сообщить(_поле.Имя);
DC>КонецЦикла;

Это foreach, count тут не нужен.
Re[4]: Оператор countof
От: DenisCh Россия  
Дата: 09.03.19 07:57
Оценка:
Здравствуйте, vsb, Вы писали:

vsb> vsb>> Что за цикл по полям структуры? Не бывает такого.


vsb> DC>Для каждого _поле из мСтруктура Цикл

vsb> DC> сообщить(_поле.Имя);
vsb> DC>КонецЦикла;
vsb> Это foreach, count тут не нужен.

Для сч = 0 по мСтруктура.Количество() — 1 Цикл
сообщить(мСтруктура[сч];
КОнецЦикла;
[url=https://github.com/abbat/avalon1.0.449[/url]
Re: Оператор countof
От: RedApe Беларусь  
Дата: 11.03.19 10:09
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Для перечислений — количество элементов в перечислении (это бывает полезно).


enum Enum
{
  A = 0,
  B = 0,
};

std::cout << _countof(Enum); // ???


XC>Тем ни менее, при наличии развитой рефлексии и макросов времени компиляции такой оператор мог бы быть полезен.


Будет развитая рефлексия, будут и способы её использовать. Сейчас зачем что-то выдумывать?
--
RedApe
Re[2]: Оператор countof
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 11.03.19 12:38
Оценка: 33 (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 )
Re: Оператор countof
От: _NN_ www.nemerleweb.com
Дата: 13.03.19 13:00
Оценка:
Здравствуйте, x-code, Вы писали:

std::size ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Оператор countof
От: scf  
Дата: 13.03.19 13:11
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>(просто хотелось похвастать возможностями языка D )


Напугал. Я уж подумал, что это новый стандарт С++.
Re: Оператор countof
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.03.19 15:09
Оценка: +2 :))
Здравствуйте, x-code, Вы писали:

XC>Представьте себе оператор countof (по аналогии с sizeof), который возвращает количество элементов в какой-то составной сущности.

Любые дизайн-решения нужно начинать со сценариев использования.
Если сценарий покрывает достаточно частый случай и его реализация лучше, чем альтернативы — то можно хотя бы обсуждать такую штуку.
Без сценариев разговор беспредметен — этот оператор ничуть не лучше оператора stdevof(), который возвращает стандартное отклонение размеров (sizeof) всех компонентов составной сущности, побитово приведённое из double в int64.
Для массивов он, разумеется, возвращает 0. Почему бы не подумать о том, как мог бы быть реализован такой оператор?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.