C++如何使用SmartPointer Concept约束迭代器值类型无需显式指定模板参数
问题根源
你编写的模板无法自动推导参数的核心原因是:模板参数T仅出现在约束从句中,未在函数参数列表的类型里出现,编译器无法通过你传入的迭代器参数反推出T的类型,因此要求手动显式指定。
你期望的写法思路是对的,只是语法使用错误:SmartPointer是对类型的约束规则,本身不是类型,不能作为std::same_as的比较对象,正确的用法是将需要检查的类型传入SmartPointer做约束校验。
正确实现
直接去掉不需要的模板参数T,在约束从句中直接校验迭代器的值类型是否满足SmartPointer即可:
template <std::forward_iterator TIterator, std::sentinel_for<TIterator> TIteratorSentinel> requires SmartPointer<std::iter_value_t<TIterator>> void doWithSmartPointers(TIterator begin, TIteratorSentinel end) { for (auto it = begin; it != end; ++it) { // 原有逻辑,it->get()可以正常调用 } }
修改后调用时不需要显式指定任何模板参数,直接传入迭代器doWithSmartPointers(v.begin(), v.end())即可编译通过,完全符合需求。
补充说明
你对模板推导指引的认知是正确的,推导指引仅用于类模板的实例化推导,函数模板本身依赖参数列表做推导,不需要也不支持推导指引。
内容的提问来源于stack exchange,提问作者Julian Carrivick
相关产品推荐
相关产品推荐

