Ящитаю, некоторые библиотеки там в упор не сдались.
Это касается, например, foreach, lambda, tuple (в двух ипостасях!).
Почему?
Наверное, потому что это все же костыли, а не решения...
По отдельности они вроде бы и ничего так. Но практика - вещь суровая, и там всегда требуется некая комплексность. В моей, оговорюсь, практике эти три примитива (foreach, lambda, tuple), как правило, используются разом. Достаточно типична ситуация, когда foreach надо применить к списку tuples возвращаемых каким-то фильтром с использованием анонимных функций. Боюсь даже представить, какое спагетти получится из простого
// Вытащим наружу все проблемы :)
foreach(var x in filter(x => x.a == y && MyCompare(x.b, y), tuple_source)) {
do_something_with(x);
}
Нувыпоняли. В общем случае, придется сваять привязку для FOREACH, доп.код, напрямую с задачей не связанный, для лямбды, и развернуть обращения к кортежам ( get<n>(x) ) - вот такой кандминимум ;-) Вся эта акробатика вполне закономерно снижает простоту и ясность кода, причем единственный профит - производительность, имхо нифига не перевесит проблему сопровождаемости получившегося кода, ибо полезных программ без багов не бывает :)
Хотелось бы услышать о светлом и прекрасном опыте использования данных либ и буста вообще (интересен, в первую очередь, опыт юзания Boost.Function, Fusion, Spirit, BCCL. Всякие там Mpi, asio, iostream, smart_ptr в данном контексте как бы не слишком интересны)