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

如何让C++模板函数仅接受int类型可变参数及模式疑问

问题场景

现有一个用于求和的C++模板函数:

template<class ...Args>
auto sum(Args... args) // 原版本支持任意类型,过于灵活
{
    return (... + args); // C++17折叠表达式
}

参考std::conjunction的示例代码:

template<typename T, typename... Ts>
std::enable_if_t<std::conjunction_v<std::is_same<T, Ts>...>, int>
control(T, Ts...)
{
    std::cout << "all types in pack are T\n";
    return 0;
}

该示例会检查所有Ts类型与T一致(比如全double参数也能通过编译),不符合“仅接受int类型可变参数”的需求,因此提出以下问题:

  1. 如何实现让函数仅接受int类型的可变参数?
  2. 上述conjunction示例拆分T和Ts是否仅为类型检查?它是否仅用于一组可变参数?此模式的名称是什么?

解答

1. 实现仅接受int类型的可变参数

有两种常用实现方式:

方式一:C++17及以上,结合std::conjunction和std::is_same

直接约束所有模板参数都是int:

#include <type_traits>

template<class ...Args>
std::enable_if_t<std::conjunction_v<std::is_same<Args, int>...>, int>
sum(Args... args)
{
    return (... + args);
}

方式二:C++20及以上,使用requires约束(更直观)

template<class ...Args>
requires (std::is_same_v<Args, int> && ...)
auto sum(Args... args) -> int
{
    return (... + args);
}

两种方式都会在传入非int类型参数时触发编译错误,确保仅接受int类型的可变参数。

2. 关于conjunction示例的分析

  • 拆分T和Ts的核心目的是类型检查:以第一个参数的类型T为基准,验证后续所有Ts参数的类型都与T一致,实现“所有参数类型相同”的约束,而非固定为某一特定类型(比如int)。
  • 它确实用于一组可变参数:Ts...就是可变参数包,T是从可变参数中拆分出的第一个参数的类型,本质是对整个参数列表的类型一致性做校验。
  • 这个模式的名称是同类型可变参数约束(或更严谨的说法:参数类型一致性验证模式),核心是利用模板参数拆分和类型 trait(std::conjunction+std::is_same)实现对参数包的类型统一校验。

内容的提问来源于stack exchange,提问作者rookie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:45:11