跳到主要内容

细节研究

一、判断成员个数

之前讲解的判断元素个数的方法, 对于普通的数据类型, 是正确的. 但是对于某些模版; 甚至是某些编译器, 它的结果都是不一样的...

例如:

实际上发现, 我们目的只是需要获取成员个数, 我管你是怎么初始化的...

而且, 上面的排列组合, 明显是不对的, 仅排列了传参, 却没有排列模版递归的传参, 这不行啊...

如果我们可以知道它是使用什么变量类型, 不就可以直接使用这个变量进行构造了吗?

但是我们很难这样做...

但是不如换个角度, 我们仅为自己的目的而做, 比如我们需要类型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 就稳的一批...

最终:

加载中...
请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...