C++中能否实现"部分递归"的函数约束?
关于C++ TrivialSerializer策略类的递归约束匹配问题
我正在编写策略类TrivialSerializer,用于嵌入后续C++函数中。该策略需序列化由其他策略指定类型的对象并写入流,仅需序列化对象值——因为对象的布局与结构已预先定义。
为实现该功能,我使用泛型模板静态成员函数:
template <typename T> static void write(output_stream_t& stream, T const& object);
仅保留部分特化与重载版本为非删除状态。例如,为sized range编写的泛型特化如下:
template <ranges::sized_range T> requires requires(output_stream_t& stream, ranges::range_value_t<T> value) { { write<ranges::range_value_t<T>>(stream, value) }; } static void write(output_stream_t& stream, T const& range);
同时我还为元组、整数类型编写了类似特化,并为特定类提供单独重载。
问题在于语言的约束解析方式与预期不符:vector<vector<int>>无法匹配sized range特化,因requires子句评估时,其值类型vector<int>的特化尚未实例化,但单独使用vector<int>时可正确匹配重载。
我期望调用write(output_stream_t&, vector<vector<int>> const&)时,类型检查器能递归匹配重载:先匹配sized range特化,再尝试调用write(output_stream_t&, vector<int> const&),进而再次匹配sized range特化,最终找到int对应的整数特化,判定vector<vector<int>>可作为参数。
核心问题
能否让C++约束检查器执行这种递归重载匹配,还是必须在write函数体内用运行时约束检查?
次要问题
C++标准委员会或工作组是否有相关提案解决该问题?
我已查看过相关问题,但未找到适用方案。
内容的提问来源于stack exchange,提问作者AdamantConlanger
相关产品推荐
相关产品推荐

