勘误:
原书(中文版)3.13节,65-69页中GenScatterHierarchy以及FieldHelper均存在问题,当TypeList中类型有重复时,无法通过编译(原因在于“二义性基类”)。
书中出现的二义性问题,可以用一小段代码演示一下:
class A{}; class B:public A{}; class C:public A,public B{}; void test() { C c; A& cf =c;//wrong,don't try this at home. B& cbf =c;//right A& caf = cbf;//right }
由于C继承了两个A,一个直接继承,一个间接继承,所以将C转换成A,存在两条路径,无法转换。甚至我们永远无法访问C直接继承的A!
继承B的路径是唯一的,所以可以通过B,再次转换成为A。
《C++设计新思维》书中给出的代码和类图,向右侧转换是唯一的,但是向左侧转换时路径不为一,所以TypeList一旦包含重复类型后,无法通过编译。
这个问题已经解决了,具体解决方案请参看Loki源码 Loki源码
这里我简要说一下,解决方法就是确保左端的直接父类是唯一的,这样即可有一条唯一的路径可以转换到某一基类。
C++14 新法:
首先,给出typelist和操作typelist的两个函数
template <typename... T> struct TypeList; template <int I, typename Arg> struct at; template <int I, typename Head, typename... Tail> struct at<I, TypeList<Head, Tail...>> { typedef typename at<I - 1, TypeList<Tail...>>::type type; }; template <class Head, typename... Tail> struct at<