gpt4 book ai didi

c++ - 模板相关参数的类模板参数推导

转载 作者:行者123 更新时间:2023-12-01 14:37:15 26 4
gpt4 key购买 nike

让我们从number类的简单添加方法开始:

class number {
int num;
public:
number(int num = 0): num(num) {}
operator int() const { return num; }
};

number add(number t1, number t2) {
return t1 + t2;
}

int main() {
auto result1 = add(1, 2); // auto-casting, works fine
}
现在我们想将 number变成一个模板类:
template<class T>
class number {
T num;
public:
number(T num = 0): num(num) {}
operator T() const { return num; }
};

template<class T>
number<T> add(number<T> t1, number<T> t2) {
return t1 + t2;
}
尝试以与 CTAD(理论上为基础)相同的方式调用 add,就像我们称为简单的非模板代码一样:
int main() {
number a = 3; // works, using CTAD
// auto result1 = add(1, 2); // <== what we wish for, but can't find method
// auto result2 = add(a, 2); // this also doesn't work, no ADL here :(
auto result3 = add<int>(1, 2); // this works, but is not what we wish
}
请注意,如果 add是一个 friend 函数,则基于 ADL可以使用其中一个参数 number调用它:
template<class T>
class number {
T num;
public:
number(T num = 0): num(num) {}
operator T() const { return num; }
friend number add(number t1, number t2) {
return t1 + t2;
}
};

int main() {
number a = 3; // works, using CTAD
auto result1 = add(a, 2); // works, based on ADL
// auto result2 = add(1, 2); // still doesn't work, no ADL here :(
}
关于如何允许模板类的行为与非模板相似,在调用add时具有自动强制转换的任何建议?

编辑:
该问题是根据发布的评论进行编辑的。应该强调的是,对于像 add这样的通用函数,具有这样的自动转换可能是一个错误的主意,但是假设该方法非常具体,例如 doSomethingWithNumbers

最佳答案

我认为答案很简单。在第一种情况下,使用自由函数模板,首先要执行的是重载分辨率和函数模板参数推导。由于编译器无法从作为参数传递的T(clang says:int)中检测到candidate template ignored: could not match 'number<type-parameter-0-0>' against 'int',因此重载解析失败并且程序格式错误。
当该函数定义为friend时,它是一个非模板函数。实例化类时,编译器创建了它(对于number<int>main的第一行)。现在,当它找到它(使用ADL)时,已经设置了参数类型(因为它来自number<int>实例化,所以都设置了number<int>),剩下的就是决定如何将传递的参数从int转换为number<int>,其中隐式使用转换(通过匹配的c-tor)。这里也没有CTAD。
斯科特·迈耶斯(Scott Meyers)在《有效C++》(第3版)中,第46项讨论了类似(但不完全相同)的情况:需要进行类型转换时,在模板内定义非成员函数。
编辑:
因此,要回答这个问题,函数模板的参数推导和参数的隐式类型转换不能混合使用。选一个。 (这是Meyers在上述项目中的解释。)

关于c++ - 模板相关参数的类模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62779901/

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