假设我有一个比较模板类的两个实例的测试:
TEST_F(fooSuite, fooTest) {
U<A> tA;
U<B> tB;
someCheck(tA, tB);
}
我现在想将Type-Parameterized Test和U
都设为V
,因为它们实现了相同的接口:
template <class T>
class U { ... }
template <class T>
class V { ... }
直觉上,我想写点像:
template <class TestType>
class fooSuite { };
TYPED_TEST_P(fooSuite, fooTest) {
TypeParam<A> tA;
TypeParam<B> tB;
someCheck(tA, tB);
}
REGISTER_TYPED_TEST_SUITE_P(fooSuite, fooTest);
using TypesToTest = ::testing::Types<U, V>
INSTANTIATE_TYPED_TEST_SUITE_P(fooPrefix, fooSuite, TypesToTest);
自然,由于U
和V
在此using
表达式中需要模板参数,因此无法编译。
如果没有主要的解决方法来创建包装类以进行传递,是否有可能?
如果没有主要的解决方法来创建包装类以进行传递,是否有可能?
文档中的AFAICS,答案是:不,您不能。问题是TestingTypes
具有类型,但是您想传递模板。我能看到的唯一解决方案是创建一个简单的包装器类型,将感兴趣的模板携带到测试函数中,并在其中使用所需的模板参数对其进行实例化。
免责声明:我对Google测试还不够熟悉,也许有一种方法可以做到。
但是,根据您所说的“主要变通办法”的确切含义,以下代码说明了一种可能的方法,我认为该方法应该可行。我认为这项工作还不错。
template <class T>
class U { };
template <class T>
class V { };
class A{};
class B{};
template<template<class> typename UorV>
struct TemplateHolder {
template<class Arg>
using type = UorV<Arg>;
};
template<class T, class Arg>
using instantiate_t = typename T::template type<Arg>;
// Mimick what I suspect the google testing::Types and TypeParam are.
template<class... Ts>
struct TestingTypes {};
using types_to_test = TestingTypes<TemplateHolder<U>, TemplateHolder<V>>;
int main( void ) {
using TypeParam = TemplateHolder<U>;
using ActualTypeToTestA = instantiate_t<TestingType, A>;
using ActualTypeToTestB = instantiate_t<TestingType, B>;
static_assert(std::is_same_v<ActualTypeToTestA, U<A>>);
static_assert(std::is_same_v<ActualTypeToTestB, U<B>>);
return 0;
}