为什么不能在C ++模板参数中定义新类型?

时间:2009-06-02 00:50:47

标签: c++ templates

我正在创建一个库,以允许类似OCaml / Haskell的代数数据类型和模式匹配。代数数据类型使用类似于Boost.Variant的类来实现。我希望能够在模板参数中定义新类型(构造函数),但是我收到错误。我使用自己的类型和可变参数模板,但为了简单起见,我将在这里使用Boost的variant。为什么不是这样的:

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

允许?我知道我可以单独定义类型,但这意味着我不能使用一些漂亮的宏。在大多数情况下,在C ++中, 允许您定义使用它的新类型,例如:

struct Foo { ... } bar;

我在这里定义一个新类型Foo,以及类型为bar的变量Foo。如果允许这样的事情,为什么它不适用于模板?

3 个答案:

答案 0 :(得分:2)

除了它之外没有任何原因,它不存在,我想它没有被提议添加,或者如果有的话,没有足够的支持。

如果你想追求它,我建议从标准委员会开始

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

答案 1 :(得分:1)

我猜是因为模板参数与函数参数类似,你不能声明

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

任一。如果你需要多个模板中的类(typedef),我也认为不可能遵守ODR

答案 2 :(得分:-1)

我认为即将到来C++0x Concepts非常接近,但与你所描述的完全不同。