← All posts tagged boost

Что-то не могу осилить. Нужно создать функтор, который выполняется при условии, иначе возвращает дефолтное значение. Есть что-то подобное в бусте, например?

пример использования
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::optional
есть функция, возвращающая найденное значение, что она должна возвращать, если ничего не нашла?
для понимания как пользоваться достаточно взглянуть примеры boost.org

кажись нашел багу в 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();

мене кажется, что у каждого программиста когда-то наступает этот день:
Today is a momentous day — first day of new year. Today I am going to start a new life. I am going to stop eating a greasy food, start attending a fitness club and ... today I am going to test programs I am writing.

Boost.Test driven development or my New Year resolution
boost.org