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 больше было бы.

No comments:

Post a Comment