细节研究
一、判断成员个数
之前讲解的判断元素个数的方法, 对于普通的数据类型, 是正确的. 但是对于某些模版; 甚至是某些编译器, 它的结果都是不一样的...
例如:
实际上发现, 我们目的只是需要获取成员个数, 我管你是怎么初始化的...
而且, 上面的排列组合, 明显是不对的, 仅排列了传参, 却没有排列模版递归的传参, 这不行啊...
如果我们可以知道它是使用什么变量类型, 不就可以直接使用这个变量进行构造了吗?
但是我们很难这样做...
但是不如换个角度, 我们仅为自己的目的而做, 比如我们需要类型A, 就不需要考虑兼容B了, 因为我们用不上B.
所以我们直接枚举, 把可能会失败的全部特化构建就好啦!
Tip
此处约束失败的原因不是构造函数错了, 而只是匹配失败. 比如有多个合法的参数, 亦或者是参数循环依赖了, 比如期望传入的参数也是一个类型T, 而需要它我就需要推导, 而传入是依赖隐式转换的, 隐式转换又依赖传参类型, 这样循环依赖就匹配失败了.
再或者是 GCC 的 std::string_view, 它虽然匹配到 一个参数 (const char*), 但是又因为又有一个构造参数是从 (const char*. std::size_t len) 构造的, 导致推导失败了 (不知道是不是这样..., 总之就GCC有这个问题. 此时如果传参std::nullptr_t就ok~)
再或者是匹配到初始化列表里面去了 (但是写成聚合类构造的方式, 应该不会优先这样)
总之一番研究, 发现 GCC 和 MSVC 这两难兄难弟, 总有一个会掉链子, 而 Clang 就稳的一批...
最终:
加载中...

