Моделирование соответствия шаблону ML-стиля в С++ - программирование

Моделирование соответствия шаблону ML-стиля в С++

В названии написано почти все, как мне пойти на симуляцию сопоставления шаблонов ML-стиля на С++, например,

Statement *stm;
match(typeof(stm))
{
    case IfThen: ...
    case IfThenElse: ...
    case While: ...
    ...
}

Где "IfThen", "IfThenElse" и "While" - это классы, которые наследуют "Statement"

4b9b3361

Ответ 1

Недавно в комитете С++ появилась статья, описывающая библиотеку, которая позволяет сделать именно это:

Открытый и эффективный коммутатор типов для С++ от Stroustup, Дос Рейс и Солодский
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3449.pdf

Ссылка на страницу с исходным кодом:
https://parasol.tamu.edu/~yuriys/pm/

Отказ от ответственности: я не пытался скомпилировать или использовать эту библиотеку, но, похоже, это соответствует вашему вопросу.

Вот один из примеров, предоставленных библиотекой:

#include <utility>
#include "match.hpp"                // Support for Match statement

//------------------------------------------------------------------------------

typedef std::pair<double,double> loc;

// An Algebraic Data Type implemented through inheritance
struct Shape
{
    virtual ~Shape() {}
};

struct Circle : Shape
{
    Circle(const loc& c, const double& r) : center(c), radius(r) {}
    loc    center;
    double radius;
};

struct Square : Shape
{
    Square(const loc& c, const double& s) : upper_left(c), side(s) {}
    loc    upper_left;
    double side;
};

struct Triangle : Shape
{
    Triangle(const loc& a, const loc& b, const loc& c) : first(a), second(b), third(c) {}
    loc first;
    loc second;
    loc third;
};

//------------------------------------------------------------------------------

loc point_within(const Shape* shape)
{
    Match(shape)
    {
       Case(Circle)   return matched->center;
       Case(Square)   return matched->upper_left;
       Case(Triangle) return matched->first;
       Otherwise()    return loc(0,0);
    }
    EndMatch
}

int main()
{
    point_within(new Triangle(loc(0,0),loc(1,0),loc(0,1)));
    point_within(new Square(loc(1,0),1));
    point_within(new Circle(loc(0,0),1));
}

Это удивительно чисто!

Внутренние части библиотеки выглядят немного страшнее. Я сделал быстрый взгляд, и, похоже, довольно много передовых макросов и метапрограмм.