case-подобные конструкции на типах
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 21.12.12 01:20
Оценка: 30 (5)
Функциональное программирование стучится к нам в двери Довольно интересная (правда не уверен что очень уж полезная) библиотечка для 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 можно найти тут.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.