Как получить идемпотентное значение для бинарных функций по шаблону?

В моем коде я хотел бы использовать 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 для умножения и так далее. Существует ли какой-то стандартный механизм получения таких значений? Должен ли я свернуть свой собственный?

Заметки:

  • Я знаю, что не все функторы должны иметь идемпотенты, даже не все симметричные; пусть будет ошибка в тех случаях.

1

Решение

В стандартной библиотеке такого объекта нет. Фактически в стандартной библиотеке есть шаблонная функция, которая часто используется с идемпотентными значениями: std::accumulate; и это требует, чтобы пользователь сам предоставил идемпотентную ценность.

Вы можете предоставить get_idempotent шаблонный класс, специализируйте его для стандартных функторов и требуйте, чтобы пользователь специализировал его для любого определенного пользователем функтора. подобно iterator_traits, allocator_traits, numeric_limitsи т. д. Отсутствие такой специализации должно быть ошибкой (staic_assert?)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]