如何获取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
相关产品推荐
相关产品推荐

