如何从可变模板实参推导const版本的用户自定义类型模板实参?
自定义类型实现从可变版本推导const版本模板实参的方案
是的,你可以通过类模板推导指南结合隐式转换构造函数,让自定义的MySpan<int>自动推导并转换为MySpan<const int>,从而直接传入接受MySpan<const T>的函数。
实现代码
#include <type_traits> template<typename T> struct MySpan { // 默认构造函数 MySpan() = default; // 模板转换构造函数:支持从非const的MySpan<U>隐式转换到MySpan<const U> template<typename U> MySpan(const MySpan<U>&) requires std::is_convertible_v<U*, const T*> {} }; // 推导指南:当用MySpan<T>构造MySpan时,推导目标为MySpan<const T> template<typename T> MySpan(MySpan<T>) -> MySpan<const T>; template<typename T> void takingConst(std::span<const T>) {} template<typename T> void takingMyConst(MySpan<const T>) {} int square(int num) { std::span<int> stdSpan{}; takingConst(std::span<const int>(stdSpan)); // std::span仍需显式转换 MySpan<int> mySpan{}; takingMyConst(mySpan); // 现在可正常编译 return num * num; }
关键说明
- 转换构造函数:模板构造函数允许
MySpan<U>隐式转换为MySpan<const U>,requires约束确保指针类型的兼容性,避免非法转换。 - 推导指南:明确告诉编译器,当用
MySpan<T>作为源构造新的MySpan对象时,目标类型的模板参数是const T。这直接解决了函数调用时的模板参数推导问题,让编译器能正确匹配takingMyConst的MySpan<const T>参数,推导出T=int。
内容的提问来源于stack exchange,提问作者Andreas Loanjoe
相关产品推荐
相关产品推荐

