C++14下如何实现std::array重载以调用可变参数函数
实现方案
你只需要在第二个参数位置传入C++14支持的泛型lambda作为转发层,调用原始可变参数版本的method即可,不需要额外捕获变量。
首先需要修正你现有辅助函数的一个类型错误:methodApply的索引序列参数声明为uint32_t...,但标准库std::index_sequence的索引类型是std::size_t,类型不匹配会导致编译失败,需要统一类型。
修正后的完整可运行代码如下:
#include <array> #include <utility> // 原始可变参数版本的method template <typename... Args> CustomType<Args...> method(const Args&... args); // 修正类型后的通用辅助函数 template <typename T, std::size_t N, typename VariadicFunc, std::size_t... I> auto methodApply(const std::array<T, N>& arr, VariadicFunc func, std::index_sequence<I...>) { return func(arr[I]...); } template <typename T, std::size_t N, typename VariadicFunc, typename Indices = std::make_index_sequence<N>> auto methodArr(const std::array<T, N>& arr, VariadicFunc func) { return methodApply(arr, func, Indices()); } // std::array版本的method重载 template <typename T, std::size_t N> auto method(const std::array<T, N>& arr) { return methodArr(arr, [](const auto&... args) { return method(args...); }); }
关键说明
- 不能直接将
method作为函数参数传入:当前作用域存在两个method重载(可变参数版本、array版本),编译器在传参阶段无法推导你需要引用哪个重载版本,会触发歧义编译错误。 - 泛型lambda的参数声明为
const auto&...,会自动适配methodApply展开的数组元素类型,完美匹配原始可变参数method的const引用入参要求,无额外拷贝开销。 - 不用担心lambda内的
method调用会递归命中array版本重载:lambda内传入的是数组展开后的独立元素,不是std::array类型,编译器会自动选择原始可变参数版本的method,不会出现递归问题。 - 注意不要漏写
methodArr调用前的return,否则会触发未定义行为。 - 这套辅助函数完全通用,后续如果需要给其他可变参数函数做std::array适配,只需要修改lambda内调用的目标函数名即可,不需要改动辅助函数逻辑。
内容的提问来源于stack exchange,提问作者zhanginou
相关产品推荐
相关产品推荐

