如何从基类引入模板转换运算符operator T()?最佳方案探讨
派生类中继承基类转换运算符的跨编译器兼容写法
using声明通常用于引入基类的各类成员(包括构造函数),但在处理转换运算符时,不同编译器的兼容性问题会凸显:
using base::operator;会被GCC和Clang同时拒绝- GCC支持
using base::operator base语法来引入基类转换运算符,但该写法不被Clang兼容
声明转发函数是同时兼容两款编译器的可行方案,尽管写法稍显繁琐。本文示例已在gcc 14.2.0、clang 19.1.7、std=c++20环境下测试,SFINAE继承写法被Clang拒绝。
代码示例
#include <type_traits> #include <cstdio> #include <utility> struct base { template <typename T> requires (std::is_integral_v<T>) operator T() const { printf("to int\n"); return 0; } }; struct derived: base { // using base::operator; // 被clang & gcc拒绝 // using base::operator base; // 被clang拒绝 template <typename T> requires (std::is_floating_point_v<T>) operator T() const { printf("to float\n"); return 0; } // 两款编译器均支持 template <typename T> requires requires { (T) std::declval<base>(); } operator T() const { return base::operator T(); } }; int main() { derived D; (int) D; // -> to int (float) D; // -> to float }
测试结果
将derived对象D转换为int类型时输出to int,转换为float类型时输出to float。
内容的提问来源于stack exchange,提问作者Yuxai
相关产品推荐
相关产品推荐

