首页 > 解决方案 > 谷歌测试:带有模板的模板模板的笛卡尔积类型列表

问题描述

假设我有两个类接受每个模板参数:

template <typename T> class A { };
template <typename T> class B { };

我想为 , 和 , , 运行谷A<int>歌测试,A<double>即笛卡尔积x 。如何使用所有这些组合自动生成 google 测试对象?A<float>B<int>B<double>B<float>[A, B][int, double, float]testing::Types

标签: c++googletest

解决方案


您可以使用参数包做到这一点:

template <typename T> class A { public: void DoesBlah() { std::cout << "A:" << T(); } };
template <typename T> class B { public: void DoesBlah() { std::cout << "B:" << T(); } };

template <typename T>
class FooTest : public ::testing::Test {
};

template <typename T>
T& TestObj(T& o) {
    o.DoesBlah();
    return o;
}

template <typename... Ts>
void param_divider(Ts&... obj) {}

template <typename... Ts>
void foreachobj(Ts&... obj)
{
    param_divider(TestObj(obj)...);
}

typedef ::testing::Types<int, double, float>  MyTypes;
TYPED_TEST_CASE(FooTest, MyTypes);
TYPED_TEST(FooTest, Test) {
    foreachobj(A<TypeParam>(), B<TypeParam>());
}

推荐阅读