2009-06-02 28 views
2

我正在創建一個庫,以允許OCaml/Haskell-like代數數據類型和模式匹配。代數數據類型使用類似於Boost.Variant的類來實現。我希望能夠在模板參數中定義新的類型(構造函數),但是我得到一個錯誤。我用variadic模板使用自己的類型,但爲了簡單起見,我將在此使用Boost的variant。爲什麼不是這樣的:爲什麼你不能在C++模板參數中定義新類型?

typedef variant < 
    class Foo { ... }, 
    class Bar { ... } 
> Baz; 

允許?我知道我可以分別定義類型,但這意味着我不能使用一些很好的宏。在大多數情況下,在C++中,你允許你在哪裏使用它來定義一個新的類型,例如:

struct Foo { ... } bar; 

這裏我定義了一個新的類型FooFoo類型的變量bar。如果允許這樣的事情,爲什麼它不適用於模板?

回答

1

我想這是因爲模板參數被當作類似於函數參數,你不能宣佈

void func(class A{} a, class B{} b); 

要麼。如果您需要多個模板(typedef)中的類,我也認爲遵守ODR是不可能的。

2

真的沒有理由,除了它不在那裏,我想它沒有被建議添加,或者如果它沒有足夠的支持。

如果你想追求它,我建議先從標準委員會

http://www.open-std.org/Jtc1/sc22/wg21/

-1

我認爲即將來臨C++0x Concepts是非常接近,但不完全一樣,你所描述的。

+0

這與此無關。 – Zifre 2009-06-04 22:45:49

相關問題