пример использования
boost::function<bool()> f = functor<bool(), predicate, false);
Шаблонные шаблонные параметры это прошлый век, они не удобны. Есть способы их избегать. Например: есть класс A, в котором нужно объявлять контейнер из произвольного типа, а тип контейнера передавать параметром шаблона: template <typename T, typename Container> struct A { typedef Container<T> type; }; Но так как Container это шаблон, принимающий два параметра: тип данных и тип аллокатора, то следует писать так: template <typename T, template<typename, typename> class Container> struct A { typedef Container<T, std::allocator<T> > type; } Но я не охочу указывать явно и самостоятельно тип аллокатора, это может првести к ошибке. Чтобы получить тип теперь мы должны вызвать: typedef A<int, std::vector>::type type; В boost mpl есть плейсхолдеры, которые используются для создания лямбда метафункций. С помощью них можно избежать создания шаблонных шаблонных параметров. То есть я передаю в шаблон A уже инстанцированный шаблон так: typedef A<int, std::vector<boost::mpl::_1> >::type type; Тогда в шаблоне A инстанцирование конейнера с произвольным типом будет выглядеть так: #include <boost/mpl/apply.hpp> template <typename T, typename Container> struct A { typedef boost::mpl::lambda<Container> lambda; typedef typename boost::mpl::apply<lambda, T>::type type; };
Только сейчас обнаружил для себя BOOST_AUTO (#include <boost/typeof/std/utility.hpp>), например, перебирать итераторы можно вместо громоздкого for (std::map<int, int>::const_iterator iter = a.begin(); iter != a.end(); ++iter) так: for (BOOST_AUTO(iter, a.begin()); iter != a.end(); ++iter)
кажись нашел багу в boost::asio::io_service::work при пересоздании work io_service.run() не держится и завершается :( using boost::asio::io_service; io_service io_service; io_service::work *work = new io_service::work(io_service); delete work; work = new io_service::work(io_service); // тут должен висеть, а не висит io_service.run();
to @analizer #include <boost/tuple/tuple.hpp> int seconds = 0; int milliseconds = 0; boost::tie(seconds, milliseconds) = precise_time(); tie понимает как std::pair так и boost::tuple