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

如何获取Google Test中::testing::Types模板的元素数量?

获取Google Test testing::Types的元素数量及类型转换方案

一、直接获取testing::Types的元素数量

Google Test的::testing::Types本身没有内置类似std::tuple_size的接口,但可以通过自定义类型萃取模板实现编译时计数:

#include <gtest/gtest.h>

namespace detail {
    template<typename Types>
    struct types_size;

    template<typename... Ts>
    struct types_size<::testing::Types<Ts...>> : std::integral_constant<std::size_t, sizeof...(Ts)> {};
}

// 使用示例
using MyTypes = ::testing::Types<int, double, std::string>;
static_assert(detail::types_size<MyTypes>::value == 3, "Type count mismatch!");

这个模板通过特化testing::Types<Ts...>,利用sizeof...(Ts)直接获取参数包的元素数量,完全是编译时计算,满足静态断言的需求。

二、编译时将std::tuple转换为testing::Types

可以通过模板特化提取tuple的类型参数包,以此构造testing::Types:

namespace detail {
    template<typename Tuple>
    struct tuple_to_types;

    template<typename... Ts>
    struct tuple_to_types<std::tuple<Ts...>> {
        using type = ::testing::Types<Ts...>;
    };
}

// 使用示例
using MyTuple = std::tuple<int, double, std::string>;
using MyTypesFromTuple = typename detail::tuple_to_types<MyTuple>::type;
// 验证转换后的类型数量匹配
static_assert(detail::types_size<MyTypesFromTuple>::value == std::tuple_size<MyTuple>::value, "Conversion failed!");

这样就能把tuple的类型集合无缝转换成testing::Types,方便在TYPED_TEST_SUITE中复用已有的tuple类型定义。

三、在TYPED_TEST_SUITE中结合使用

如果你的类型集合原本基于tuple定义,可直接转换后用于测试套件:

using MyTuple = std::tuple<int, double, std::string>;
using TestTypes = typename detail::tuple_to_types<MyTuple>::type;

TYPED_TEST_SUITE(MyTypedTest, TestTypes);

// 静态断言确保测试类型数量与原tuple同步
static_assert(detail::types_size<TestTypes>::value == std::tuple_size<MyTuple>::value, "Test suite types out of sync with source!");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:40:30