2014-03-26 92 views
0

我的目標是定義一個模板來創建一個建設性的類型,例如:是可變參數模板足以確定建設性類型

MyCT := foo | bar of int | baz of WeirdClass | bat of (String, MyCT) 

內部,前綴是一個枚舉類型的雙字節值,即: {0}{1,-20}{2,{weirdo:WeirdClass}}{3,{"Like I said",0}}{3,Pair<String,MyCT>{"a",{1,626}}}等。

它看起來像...語法的可變參數模板可以幫助,但我關注以下幾點:對應於枚舉值的數量

  1. 可以創建構造函數的倍數是多少?
  2. 如果枚舉值的數量不等於相應類型的數量,我們可以拋出一個編譯時錯誤?
  3. 由模板創建的類型將本身是形式MyCT<ET>,其中ET是枚舉類型的模板。我們如何確保只使用與枚舉值相對應的構造函數?
  4. 如果在MyCT<et>,et不在ET中,模板的枚舉類型是否可以拋出編譯時錯誤?
  5. 我們能做到這一點,使MyCT<foo>鍵入匹配MyCT<baz>
+0

的問題是不明確的。我沒有看到* compile-time | runtime *障礙在這裏:爲什麼枚舉標記?運行時是否指定了枚舉值?如果它在編譯時提供的所有東西,我認爲我們可以輕鬆地重新設計,並使用一些模板元編程實現它。 – Manu343726

+0

這個目標值得讚揚,但並非真的可以實現。我誠摯的建議是忘記它。如果你想要ML或Haskell,你知道在哪裏找到它們。 –

+0

感謝您的想法,Manu343726。以下內容不應編譯,並且應該給出編譯時錯誤: ConstrType 因爲ET有四個值並且只提供三種類型。這應該通過檢查語法來輕鬆處理。 比方說,我們有正確的語法建設性類型的模板和實例化它是這樣的: 模板 公共類MyCT ; 模板 公共類MyCT :ConstrType >> {...} (語法除外),我們希望在MyCT 對等嚴格類型。 沒有MyCT 。 –

回答

0

爲了使這一點更有趣,也讓我們定義(遞歸)功能fuz這個建設性的類型,在ML的語法:

let rec fuz = fun (foo)  -> 4 
       | (bar b) -> 2 * b 
       | (baz w) -> w.eird 
       | (bat(s,m)) -> length(s) - fuz(m);; 

其中(說)

#type WeirdClass = {eird:int};; 

所以在這裏,我們走在C++(live example):

struct WeirdClass { int eird; }; 

struct MyCT { virtual int fuz() const = 0; }; 

struct foo : MyCT 
{ 
    virtual int fuz() const override { return 4; }; 
}; 

struct bar : MyCT 
{ 
    int b; 
    bar(int b) : b(b) { } 
    virtual int fuz() const override { return 2 * b; }; 
}; 

struct baz : MyCT 
{ 
    WeirdClass w; 
    baz(const WeirdClass& w) : w(w) { } 
    virtual int fuz() const override { return w.eird; }; 
}; 

struct bat : MyCT 
{ 
    std::string s; 
    const MyCT& m; 
    bat(const std::string& s, const MyCT& m) : s(s), m(m) { } 
    virtual int fuz() const override { return s.length() - m.fuz(); }; 
}; 

int main() 
{ 
    foo f; 
    bar r{-20}, c{626}; 
    baz z{{8}}; 
    bat a{"Like I said",f}; 
    bat t{"no templates needed",c}; 

    cout << f.fuz() << " " << r.fuz() << " " 
     << c.fuz() << " " << z.fuz() << " " 
     << a.fuz() << " " << t.fuz() << endl; 
} 

輸出:

4 -40 1252 8 7 -1251 

無需奇怪的可變參數模板。

+0

是的,我希望完全實例化的模板具有這種ML功能,併爲術語代數做了類似的事情。然而,在這個問題中,我進一步考慮了這個問題,並想知道現在是否可以用C++簡潔地表示一個術語代數的簡單實現。顯然,現在情況並非如此。 –

+0

@CarlKlapper作爲一個運行時解決方案,多態類型可以是我的示例所示的構造類型的直接轉換。在我認爲的問題中,你提出的混合方式幾乎是不可能的。然而純粹的編譯時間可能是一個選項,因爲C++模板非常強大。如果你有興趣,去年我實現了一個微縮編譯時Scheme/CAML解釋器,不幸的是,它甚至支持像Scheme的set!這樣的命令性的方面。編譯器運行10分鐘後停止,佔用24GB內存,至少產生正確的結果:-) – iavr

相關問題