В моем коде я хотел бы использовать std :: plus, std :: multiplies и friends — для общего накопления, то есть передать функтор, а затем применить его к последовательности элементов для результата. Теперь, вместо того, чтобы просто использовать специальные два первых элемента (т.е.
MyFunctor op;
my_acc = op(arr[0] + arr[1])
for(int i = 2; i < length; i++) my_acc = op(my_acc, arr[i]);
Я хотел бы инициализировать my_acc
с идемпотентным значением:
MyFunctor op;
my_acc = get_idempotent<decltype(arr[0]),MyFunctor>();
for(int i = 0; i < length; i++) my_acc = op(my_acc, arr[i]);
например 0 для сложения с целыми числами, 1 для умножения и так далее. Существует ли какой-то стандартный механизм получения таких значений? Должен ли я свернуть свой собственный?
Заметки:
В стандартной библиотеке такого объекта нет. Фактически в стандартной библиотеке есть шаблонная функция, которая часто используется с идемпотентными значениями: std::accumulate
; и это требует, чтобы пользователь сам предоставил идемпотентную ценность.
Вы можете предоставить get_idempotent
шаблонный класс, специализируйте его для стандартных функторов и требуйте, чтобы пользователь специализировал его для любого определенного пользователем функтора. подобно iterator_traits
, allocator_traits
, numeric_limits
и т. д. Отсутствие такой специализации должно быть ошибкой (staic_assert
?)
Других решений пока нет …