2013-08-12 7 views
13

में मेल खाने वाले एमएल-शैली पैटर्न को सिमुलेट करना शीर्षक बहुत अधिक कहता है, मैं सी ++ में मिलान करने वाले एमएल-शैली पैटर्न को अनुकरण करने के बारे में कैसे कहूंगा, उदाहरण के लिए;सी ++

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

जहाँ 'IfThen', 'IfThenElse' और 'जबकि' वर्ग है जो 'वक्तव्य'

+0

आप [विज़िटर पैटर्न] (http://en.wikipedia.org/wiki/Visitor_pattern) –

+2

देख रहे हैं, मैंने विज़िटर पैटर्न को माना है, कुछ और अधिक सुरुचिपूर्ण होने की उम्मीद कर रहा था! – Skeen

+0

Boost.Variant और tuples जैसे कुछ का न्यायसंगत उपयोग बीजगणित डेटा प्रकारों के उपयोग की नकल कर सकता है। (दोनों प्रकार और tuples आम तौर पर उनके मूल्यों को रद्द करने के तरीके प्रदान करते हैं।) –

उत्तर

18

वहाँ सी ++ समिति में एक कागज हाल ही में जो एक पुस्तकालय है कि बस ऐसा करने की अनुमति का वर्णन था से विरासत हैं :

सी ++ के लिए

ओपन और EF फाई cient प्रकार स्विच Stroustup, डॉस रीस और Solodkyy
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3449.pdf

स्रोत कोड के साथ एक पृष्ठ की लिंक द्वारा:
01,235,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)); 
} 

यह आश्चर्यजनक रूप से साफ है!

पुस्तकालय के आंतरिक हालांकि थोड़ा और डरावना दिखता है। मैंने एक त्वरित नज़र डाली और ऐसा लगता है कि बहुत सारे उन्नत मैक्रो और मेटा प्रोग्रामिंग हैं।

+0

यह वही है जो मैं देख रहा था :) – Skeen

+3

यदि कोई और Mach7 के स्रोत की तलाश में है, तो यह यहां github पर उपलब्ध है: https: // github। com/solodon4/Mach7 – Hiura