C++ 使用googletest识别类型参数化测试中使用的基类

C++ 使用googletest识别类型参数化测试中使用的基类,c++,unit-testing,googletest,C++,Unit Testing,Googletest,一个物理模拟正在翻新,我正在尝试为要使用类型参数化测试替换的函数编写单元测试。基本设置如下所示: using MyTypes = ::testing::Types<base1<1>, base1<2>, base2<1>, base2<2>>; TYPED_TEST_CASE(tests, MyTypes); TYPED_TEST(tests, testname){ auto obj = clname(TypeParam); a

一个物理模拟正在翻新,我正在尝试为要使用类型参数化测试替换的函数编写单元测试。基本设置如下所示:

using MyTypes = ::testing::Types<base1<1>, base1<2>, base2<1>, base2<2>>;
TYPED_TEST_CASE(tests, MyTypes);
TYPED_TEST(tests, testname){
  auto obj = clname(TypeParam);
  auto parameters = generate_values(TypeParam);      
  for( auto& p : parameters ){
    // Test if obj.func(p) equals the saved values
  }
}
和结果一起,但我被告知,这是一个值,可以在机器之间更改,因此作为一个值不可用。我已尝试在MyTypes中查找相应的条目,即保存I以便

std::is_same<MyTypes[i],TypeParam>::value
std::值是否相同
这是真的,但这似乎不是任何i。使用类型参数化测试有什么好方法可以做到这一点吗?或者我需要完全使用其他东西吗?

您可以标记
base1
base1
base2
base2
。。。通过一维整数
0
1
2
3
。。。使用以下类模板
TestsWrapper
。 更具体地说,
TestsWrapper::getIdx()
返回类型
U
…T
中的位置。 比如说,

  • TestsWrapper

    您可以标记
    base1
    base1
    base2
    base2
    。。。通过一维整数
    0
    1
    2
    3
    。。。使用以下类模板
    TestsWrapper
    。 更具体地说,
    TestsWrapper::getIdx()
    返回类型
    U
    …T
    中的位置。 比如说,

    • TestsWrapper

      也许会有用也许会有用。。
      std::is_same<MyTypes[i],TypeParam>::value
      
      template<class ...T>
      class TestsWrapper
      {
         template<class U>
         static constexpr std::size_t getIdx_impl()
         {
             return 0;
         }
      
         template<class U, class T0, class ...Ts>
         static constexpr std::size_t getIdx_impl()
         {
             return std::is_same<U, T0>::value ? 0 : (getIdx_impl<U, Ts...>() + 1);
         }
      
      public:
         using Types = ::testing::Types<T...>;
      
         template<class U>
         static constexpr std::size_t getIdx()
         {
             return getIdx_impl<U, T...>();
         }
      };
      
      using TWrapper = TestsWrapper<base1<1>, base1<2>, base2<1>, base2<2>>;
      
      template <typename T>
      class test : public ::testing::Test {};
      
      TYPED_TEST_CASE(test, TWrapper::Types);
      
      TYPED_TEST(test, testname)
      {
         constexpr auto idx = TWrapper::getIdx<TypeParam>();
         ...
      }