Функциональное программирование стучится к нам в двери
Довольно интересная (правда не уверен что очень уж полезная) библиотечка для C++ — mach7, позволяет писать case-подобные конструкции базирующиеся на типах, а не на значениях.
Пример использования библиотеки:
int eval(const Expr& e)
{
Match(e)
{
Case(const Value& x) return x.value;
Case(const Plus& x) return eval(x.e1) + eval(x.e2);
Case(const Minus& x) return eval(x.e1) - eval(x.e2);
Case(const Times& y) return eval(y.e1) * eval(y.e2);
Case(const Divide& z) return eval(z.e1) / eval(z.e2);
}
EndMatch
}
int main()
{
Value a = 17;
Value b = 25;
Plus c = Plus(a,b);
std::cout << eval(a) << std::endl;
std::cout << eval(b) << std::endl;
std::cout << eval(c) << std::endl;
}
| Используемые типы |
| struct Expr
{
virtual ~Expr() {}
};
struct Value : Expr
{
Value(int v) : value(v) {}
int value;
};
struct Plus : Expr
{
Plus(const Expr& e1, const Expr& e2) : e1(e1), e2(e2) {}
const Expr& e1;
const Expr& e2;
};
struct Minus : Expr
{
Minus(const Expr& e1, const Expr& e2) : e1(e1), e2(e2) {}
const Expr& e1;
const Expr& e2;
};
struct Times : Expr
{
Times(const Expr& e1, const Expr& e2) : e1(e1), e2(e2) {}
const Expr& e1;
const Expr& e2;
};
struct Divide : Expr
{
Divide(const Expr& e1, const Expr& e2) : e1(e1), e2(e2) {}
const Expr& e1;
const Expr& e2;
};
|
| |
Нормально собирается как минимум при помощи GCC и Clang с поддержкой C++11.
Источник: описание проблемы и способов решения на
open-std.org. Исходники mach7 можно найти
тут.