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

C++可变参数模板成员函数如何检查所有模板类型均为std::int32_t

问题修正方案

你原先的写法错误是因为可变参数包展开的语法不符合C++标准要求,要实现所有传入类型都是std::int32_t的判断,本质是要对参数包中所有类型执行std::is_same判断,再把所有判断结果做逻辑与运算。

方案1:C++17及以上版本(折叠表达式写法)

最简洁的写法是用C++17引入的折叠表达式,修正后的返回语句为:

return (std::is_same<Ts, std::int32_t>::value && ...);

也可以用更简洁的辅助变量模板简化写法:

return (std::is_same_v<Ts, std::int32_t> && ...);

这种写法对空参数包也能正确返回true,完全符合你原本的逻辑预期。

方案2:兼容C++11/14版本

如果编译环境不支持C++17,可以用初始化列表展开参数包的兼容写法:

template<typename ...Ts>
bool foo() {
    bool all_int32 = true;
    // 利用初始化列表顺序执行所有类型判断
    using swallow = int[];
    (void)swallow{ 0, (all_int32 &= std::is_same<Ts, std::int32_t>::value, 0)... };
    return all_int32;
}

完整可运行的修正代码

#include <iostream>
#include <type_traits>

class Foo {
public:
    /// check if all the types are std::int32_t
    template<typename ...Ts>
    bool foo() {
        // C++17+ 写法,如用C++11/14替换为上面的兼容代码即可
        return (std::is_same_v<Ts, std::int32_t> && ...);
    } 
};

int main()
{
    Foo f;
    std::cout << std::boolalpha; // 输出布尔文本而非1/0
    std::cout << f.foo<std::int32_t, std::int32_t>() << std::endl; // 输出true
    std::cout << f.foo<std::int32_t, std::int64_t>() << std::endl; // 输出false
    return 0;
}

注:你原来代码中f.template foo的template关键字是多余的,直接调用f.foo即可正常指定模板参数


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:15:05