Конструкции конвейерной обработки итераторов C ++

Предположим, мы хотим применить серию преобразований, 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.

13
задан kirakun 25 February 2011 в 23:37
поделиться