2009-06-02 67 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

相关问题