Предположим, мы хотим применить ряд преобразований int f1(int)
, int f2(int)
, int f3(int)
к списку объектов. Наивный способ был бы
SourceContainer source;
TempContainer1 temp1;
transform(source.begin(), source.end(), back_inserter(temp1), f1);
TempContainer2 temp2;
transform(temp1.begin(), temp1.end(), back_inserter(temp2), f2);
TargetContainer target;
transform(temp2.begin(), temp2.end(), back_inserter(target), f3);
Это первое решение не является оптимальным из-за необходимости дополнительного пространства с temp1
и temp2
. Итак, давайте умнее с этим:
int f123(int n) { return f3(f2(f1(n))); }
...
SourceContainer source;
TargetContainer target;
transform(source.begin(), source.end(), back_inserter(target), f123);
Это второе решение намного лучше, потому что не только код проще, но, что более важно, требуется меньше пространства без промежуточных вычислений.
Однако композиция f123
должна определяться во время компиляции и, таким образом, фиксируется во время выполнения.
Как я попытаюсь сделать это эффективно, если состав будет определен во время выполнения? Например, если этот код был в службе RPC, а фактическая композиция, которая может быть любой перестановкой любого подмножества f1
, f2
и f3
- основана на аргументах вызова RPC.