You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:39:27