使用友元运算符函数在模板中进行隐式类型转换
要利用模板的隐式类型转换,常用的技术是定义模板类定义中的非成员友元函数。
在 C 中,模板函数只有在它们被实例化后才会被实例化以特定类型调用。在重载解析过程中,编译器会推导模板参数的类型,并消除任何与参数类型不完全匹配的模板,不包括隐式转换。
解决方案在于利用模板内定义的友元运算符函数类定义。对于每个模板实例化,编译器都会生成一个免费的非模板函数,其签名与替换类型匹配。
例如,考虑:
template <typename T> class test { friend test operator+(test const &, test const &) { return test(); } };
当使用 int 实例化模板时,编译器创建一个非模板函数:
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
此函数可通过依赖于参数的查找获得,对其参数执行隐式转换。这是因为它是在模板类外部定义的,并且在重载决策期间不需要精确的类型匹配。
因此,在对 test
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
以上是友元运算符函数如何在 C 模板中启用隐式类型转换?的详细内容。更多信息请关注PHP中文网其他相关文章!