能否引用推导指南推导出的类型?用户如何实现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
相关产品推荐
相关产品推荐

