LINUX.ORG.RU

[boost, размышлизмы] Нафига козам баяны?


0

0

Ящитаю, некоторые библиотеки там в упор не сдались. Это касается, например, 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 в данном контексте как бы не слишком интересны)


опыт юзания Boost.Function, Fusion, Spirit, BCCL

boost.function использовал в связке с bind для first-class функций с каррированием (например, для undo/redo). вполне себе позитивный опыт

вместо bccl всегда использовал проектно-специфичные велосипеды; spirit и fusion не пользовал вообще

jtootf ★★★★★
()

>foreach

А что это? Я BOOST_FOREACH юзаю регулярно, он вроде простой и жизнь облегчает. Spirit на соседнем проекте в наследство достался, вроде не все там в восторге, но подробностей не знаю.

ratatosk
()
Ответ на: комментарий от ratatosk

В моих случаях, почему-то, только усложняет :)

#include <vector>
#include <tree.hh> // http://tree.phi-sci.com/
#include <boost/foreach.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <boost/fusion/tuple.hpp>
#include <boost/fusion/adapted.hpp>

using namespace std;
using namespace boost::foreach;
using namespace boost::tuples;

tuple<int, int> a(1, 1);
boost::fusion::tuple<int, int> b(1, 1);
vector<tuple<int, int>> v;

tree<tuple<int, int>> t(a); // "STL-like container class for n-ary trees"

void main() {
	// 1. Mixing boost tuples
	bool res = (a == b); // epic win
	v.push_back(b); // epic fail

	// 2.
	tuple<int, int> x;
	BOOST_FOREACH(x, t) {} // "anything that looks like an STL container counts"
}

Мож, ручонки не оттуда выросли.

impfp
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.