Showing posts with label mpl. Show all posts
Showing posts with label mpl. Show all posts

Tuesday, September 14, 2010

MPL

Открыл для себя сегодня boost MPL. От половины велосипедов теперь смело можно избавиться.

Возникла задача - реализовать простой "паттерн" (не в глобальном смысле, а в смысле идиомы для одного отдельно взятого проекта), который бы позволил ограничивать аргумент отдельно взятой функции некоторым набором заранее известных типов. С помощью буста решилось вот так:

#include <boost/mpl/list.hpp>
#include <boost/mpl/contains.hpp>
#include <boost/utility/enable_if.hpp>

struct A {};
struct B {};
struct C {};

struct D {
typedef boost::mpl::list<A, B> good_types;

template<class T>
void func(
T const& x,
typename boost::enable_if<
typename boost::mpl::contains<good_types, T>::type
>::type* dummy = 0) {
}
};

int main() {
D d;
d.func(A());
d.func(B());
d.func(C()); // тут ошибка компиляции - можно только A и B

return 0;
}

Без буста, очевидно, строчек на 100 больше было бы.