C++ 如何处理与类型转换相关的模板函数

汤姆

我对某些编译器如何工作的一般想法是,在类型检查阶段(语义分析),AST 使用类型转换信息进行注释,因此例如:1 + 1.2,表示的节点1将使用浮点数(或双精度)进行注释指示它必须被转换,以便它可以匹配函数调用operator+(float, float)(或float.operator+(float))。

但是,当涉及模板化函数参数时,例如:

template<typename T, typename B>
void test(T a, B b) {
    a + b;
}
...
test(23, 12);
test(23, 1.2);
test(2.3, 12);
test(2.3, 1.2);

可以将不同类型的大量组合传递给此函数。因此,如何是类型转换的AST的注释ab处理?对于调用它的可能的不同类型,该函数是否重复?函数是内联的吗?

463035818_is_not_a_number

对于调用它的可能的不同类型,该函数是否重复?

是的。这大致就是编写模板的想法。test不是函数,test<int,double>是。

以下并不是真正发生的事情,但它在很大程度上可以作为一种心理模型。

你打电话

test(1,1.0);

编译器推导出T分别Bintdouble因此,它将实例化以下内容:

void test(int a, double b) {
    a + b;
}

只有现在编译器是必需的,并且具有查看是否a+b需要提升操作数之一所需的所有信息通常的规则确实适用:https : //en.cppreference.com/w/cpp/language/implicit_conversion

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何处理好休息模板API错误响应,并转换为类型安全的Json?

C ++如何处理NAN?有没有一种标准的方法还是编译器相关的?

C#如何处理嵌套(通用)类型?

如何根据C ++中的模板类型调用函数?

如何防止构造函数在C ++中强制转换参数类型?

C#编译器如何处理重载显式强制转换运算符?

如何处理或避免C ++ 11 <regex>匹配函数(第28.11节)带来的异常?

不论模板类型如何,结构的C ++函数

标准C ++输入输出流如何处理intXX_t类型?

C函数time()如何处理小数秒?

C#如何处理多种消息类型?

C ++编译如何处理共享库和模板

R的lm函数如何处理因子水平(在C_Cdqrls中?)?

如何处理C ++ 17中变体中包含的类型的无意义方法

C#和泛型:如何处理基于类型的处理?

Oracle 12c如何处理DATE数据类型中的时区数据

如何处理此C ++ Multimap析构函数?

C ++模板函数类型推导

函数模板的C ++奇怪类型转换错误

如何在模板函数C ++中更改类型名称的签名

如何处理Javafx org.w3c.dom.Element强制转换为MenuItem错误?

repr(C)类型如何处理Option?

C ++如何处理函数中指针和引用的更改?

如何处理 boost 选项头文件中的 C++ 相关警告?

在c#中将sql xml转换为json时如何处理单元素json数组?

如何处理 C 中的 typedef 数据类型(一般来说)?

如何处理错误:使用已删除的函数 C++?

如何实现智能模板类型转换(例如 C<int> / C<double> -> C<double>)

如何处理递归函数和迭代函数中的编译器错误 c2660?