You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从可变模板实参推导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;
}

关键说明

  1. 转换构造函数:模板构造函数允许MySpan<U>隐式转换为MySpan<const U>,requires约束确保指针类型的兼容性,避免非法转换。
  2. 推导指南:明确告诉编译器,当用MySpan<T>作为源构造新的MySpan对象时,目标类型的模板参数是const T。这直接解决了函数调用时的模板参数推导问题,让编译器能正确匹配takingMyConst的MySpan<const T>参数,推导出T=int。

内容的提问来源于stack exchange,提问作者Andreas Loanjoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:43:22