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

能否引用推导指南推导出的类型?用户如何实现C++相关推导需求?

问题解答

1. 能否实现这类推导指南需求?

完全可以实现。C17引入的类模板推导指南支持这种场景,结合SFINAE(C17)或者C++20的Concepts特性,就能满足「仅当Alloc符合Allocator要求时才参与重载决议」的约束,同时也能引用推导后类型的成员别名。

2. 如何引用推导类型的别名?

在推导指南的参数列表中,直接通过推导指南的模板参数组合出目标类模板的实例,再引用其成员别名即可。比如你自己实现的MyBasicString,推导指南里可以直接写typename MyBasicString<CharT, Traits, Allocator>::size_type——推导过程中会自动匹配模板参数,这个写法完全合法。

代码示例

假设你已经实现了自定义的MyBasicString和MyBasicStringView,以下是对应推导指南的实现方式:

C++17 版本(用SFINAE约束Allocator)

#include <memory> // 用于std::allocator_traits

template<typename CharT, typename Traits, typename Allocator>
// 通过enable_if过滤不符合Allocator要求的类型
typename std::enable_if_t<std::is_allocator_v<Allocator>, MyBasicString<CharT, Traits, Allocator>>
MyBasicString(MyBasicStringView<CharT, Traits>,
              typename MyBasicString<CharT, Traits, Allocator>::size_type pos,
              typename MyBasicString<CharT, Traits, Allocator>::size_type count,
              const Allocator& alloc = Allocator())
-> MyBasicString<CharT, Traits, Allocator>;

C++20 版本(用Concepts约束)

#include <concepts> // 用于std::allocator concept

template<typename CharT, typename Traits, std::allocator Allocator>
MyBasicString(MyBasicStringView<CharT, Traits>,
              typename MyBasicString<CharT, Traits, Allocator>::size_type pos,
              typename MyBasicString<CharT, Traits, Allocator>::size_type count,
              const Allocator& alloc = Allocator())
-> MyBasicString<CharT, Traits, Allocator>;

补充说明

  • 推导指南的模板参数CharT、Traits、Allocator会从传入的MyBasicStringView和Allocator参数中自动推导,因此MyBasicString<CharT, Traits, Allocator>::size_type就是最终推导出来的类的成员类型,完全匹配需求。
  • 对于Allocator的约束,C17用std::is_allocator_v配合enable_if实现过滤,C20直接用std::allocator概念语法更简洁直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:47:21