如何向C++模板函数传递可变数量pair?现有写法编译失败求方案
不用宏传递可变数量pair的几种方法
你要的就是直接传递多个{int, bool}形式的初始化器,让函数接收vector<pair<int, bool>>(或类似容器),不用宏包装。下面是几种可行的实现方式:
1. 改用initializer_list作为函数参数
直接把foo的参数改成std::initializer_list<std::pair<int, bool>>,这样就能直接传逗号分隔的初始化器,只需要在外层多套一对大括号:
#include <vector> #include <utility> void foo(std::initializer_list<std::pair<int, bool>> pairs) { // 可以直接遍历initializer_list,也转成vector用 std::vector<std::pair<int, bool>> vec(pairs); // 你的处理逻辑... } int main() { bool bNBR = true, bSWAP = false; int s = 5, n = 0; foo({ {s, bSWAP}, {n, bNBR} }); // 外层大括号包裹所有pair初始化器 }
2. 用模板参数包实现无外层括号的写法
如果想完全去掉外层大括号,直接像你最初尝试的foo({s, bSWAP}, {n, bNBR})那样调用,可以写一个模板函数展开参数包:
#include <vector> #include <utility> #include <type_traits> // 模板函数,检查每个参数都能构造pair<int, bool> template<typename... Args> std::enable_if_t<(... && std::is_constructible_v<std::pair<int, bool>, Args>)> foo(Args&&... args) { std::vector<std::pair<int, bool>> vec{ std::forward<Args>(args)... }; // 你的处理逻辑... } int main() { bool bNBR = true, bSWAP = false; int s = 5, n = 0; foo({s, bSWAP}, {n, bNBR}); // 现在可以直接这么写,完全匹配你最初的调用方式 }
这个模板会自动把每个传入的初始化器(或pair对象)转发到vector中,还能做类型检查,确保每个参数都符合pair<int, bool>的构造要求。
3. 显式构造pair传递(最直观的写法)
如果不想用模板或初始化列表,也可以显式构造pair后传入,虽然代码稍长,但完全不需要宏:
#include <vector> #include <utility> void foo(const std::vector<std::pair<int, bool>>& pairs) { // 你的处理逻辑... } int main() { bool bNBR = true, bSWAP = false; int s = 5, n = 0; // 两种写法任选: foo({ std::make_pair(s, bSWAP), std::make_pair(n, bNBR) }); // 或者C++11及以后支持的列表构造: foo({ {s, bSWAP}, {n, bNBR} }); }
内容的提问来源于stack exchange,提问作者Wasfi JAOUAD
相关产品推荐
相关产品推荐

