【发布时间】:2011-07-31 16:05:39
【问题描述】:
Typelist(在 Alexandrescu 的意义上定义它)是否主要/本质上对生成类的层次结构有用(也许对于像 boost::tuple 这样的类) 还是有很多其他领域类型列表非常有用?
【问题讨论】:
-
您是指 Alexandrescu 的类型列表概念,如“现代 C++ 编程”中所述?
Typelist(在 Alexandrescu 的意义上定义它)是否主要/本质上对生成类的层次结构有用(也许对于像 boost::tuple 这样的类) 还是有很多其他领域类型列表非常有用?
【问题讨论】:
Ulrich W. Eisenecker、Frank Blinn 和 Krzysztof Czarneck 描述的 Mixin-Based Programming in C++ 也使用了它。
【讨论】:
我相信您指的是模板链接列表之类的东西。
这是模板元编程的基本结构。模板元编程有多种应用,程序员在模板中编码问题,元程序实现算法来解决它。
Boost Spirit 经常被引用为模板元编程的主要例子,尽管很遗憾我不能告诉你太多。
【讨论】:
在我看来,类型列表最有用的是作为其他通用库的构建块,而不是直接在客户端代码中使用。如果 Boost 元组或 MPL 足够灵活,可以满足您的需求,请不要使用较低级别的工具。但是,如果您需要这种灵活性,没有什么可以说您不能直接使用类型列表。
【讨论】:
我们使用类型列表作为一种类型安全的组合,但每个子项都可以通过单个接口访问:
// Defining a typelist:
typedef TypeList<A,
TypeList<B,
TypeList<C, NullType> > > MyTypeList;
MyTypeList tl;
// Setting values in the typelist:
A a;
tl.set(a);
C c;
tl.set(c);
tl.tail().head() = newB;
// Retrieving values from the typelist:
C c = tl.get<C>();
B b = tl.tail().head();
// To reinitialize a value:
tl.reset<B>();
tl.set(B());
// To get total size:
int size = tl.count();
除此之外,还有一个用于迭代的接口和对函子的内置支持。
好处是您可以根据需要单独或同质对待孩子。
缺点是你牺牲了一定的抽象性。事情变得更加具体。它还引入了一种处理组合的新方法,对于需要使用代码的其他人来说,这是一种新的学习方法。
对我们来说,在我们使用它的地方,它非常适合。
【讨论】: