gpt4 book ai didi

c++ - 非类型模板参数的偏特化如何工作?

转载 作者:行者123 更新时间:2023-12-04 17:12:50 25 4
gpt4 key购买 nike

我想了解标准如何确定下面选择的部分特化。例如,它与特化中的模板参数数量有什么关系吗?否则,它如何确定“最适合”匹配?

#include <cstdint>

template <int ...I>
struct Vector;

template <typename T>
struct Transform;

template <int x, int ...I>
struct Transform<Vector<x,x,I...>> {
using type = int;
};

template <int ...I>
struct Transform<Vector<I...>> {
using type = char;
};

int main() {
static_assert(sizeof(Transform<Vector<1,1,2>>::type) == 4);
}

最佳答案

不,它的工作方式不同。它具有一些支配功能。如果一个特化显然进一步专门化了另一个特化,那么它就会被选择,否则它就是模棱两可的。该方法不太智能,旨在处理简单的情况。在任何复杂的情况下,您最好确保完全没有歧义。

例如,两者都不是

template <int x, int y, int ...I>
struct Transform<Vector<x, y, y, y, I...>> {
using type = short;
};

也不

template <int x, int y, int ...I>
struct Transform<Vector<x, y, y, x, I...>> {
using type = short;
};

是两个 x 的进一步特化案例

template <int x, int ...I>
struct Transform<Vector<x, x, I...>> {
using type = int;
};

因此,如果您要声明其中一个,则 Transform<Vector<1,1,1,1>>会模棱两可。要解决它,您必须为 Vector<x, x, x, x, I...> 定义特化或限制以前的。

但是,如果您要定义的不是上述内容

template <int x, int y, int ...I>
struct Transform<Vector<x, x, y, y, I...>> {
using type = short;
};

然后它将成为 Transform<Vector<1,1,1,1>> 的选择形式- 因为这显然进一步专门化了两个 x案例。

关于c++ - 非类型模板参数的偏特化如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69155639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com