【发布时间】:2014-03-26 21:38:09
【问题描述】:
我的目标是定义一个模板来创建一个构造类型,例如:
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}}} 等。
看起来可变参数模板的... 语法可能会有所帮助,但我担心以下几点:
- 可以根据枚举值的个数创建多个构造函数吗?
- 如果枚举值的个数不等于对应类型的个数,会不会抛出编译时错误?
- 模板创建的类型本身就是
MyCT<ET>形式的模板,其中ET是枚举类型。我们如何确保我们可以只使用与枚举值对应的构造函数? - 如果
MyCT<et>中的et不在模板的枚举类型ET中,我们能否抛出编译时错误? - 我们可以这样做以使
MyCT<foo>类型匹配MyCT<baz>?
【问题讨论】:
-
问题不清楚。我没有看到 compile-time|runtime 障碍在哪里:为什么要进行枚举标记?该枚举值是在运行时指定的吗?如果所有东西都是在编译时提供的,我认为我们可以轻松地重新设计它并使用一些模板元编程让它工作。
-
这个目标值得称道,但并不是真的可以实现。我真诚的建议是忘记它。如果您想要 ML 或 Haskell,您知道在哪里可以找到它们。
-
感谢您的想法,Manu343726。以下不应该编译并且应该给出一个编译时错误:ConstrType
因为 ET 有四个值并且只提供了三个类型。这应该很容易通过检查语法来处理。假设我们有一个具有正确语法的构造类型模板,并将其实例化如下: template public class MyCT ;模板 public class MyCT : ConsrType >>{ ... } (除了语法)我们希望在 MyCT 中严格键入 et 。没有 MyCT .
标签: c++ constructor variadic-templates