我实际上正在使用googletest框架。我有一个值参数化测试

std::tuple<int, double>

此int表示规则多边形中的顶点数,而double表示其半径。我可以使用这样的结构来表示:
struct RegularPolygon{
    int NbVertices;
    double Radius;
}

问题是我实际上是使用Combine参数生成器创建测试的:
INSTANTIATE_TEST_CASE_P(RegularPolygon, PolygonTestCase, testing::Combine(
    testing::Range(3, 10),
    testing::Range(1.0, 10.0)));

因此,如果我想切换到使用
RegularPolygon

作为我的参数struct,我必须对两个范围的笛卡尔积进行硬编码。

除非有一种方法来定义我自己的RegularPolygon生成器,否则它只会将int映射到RegularPolygon::NbVertices,将double映射到RegularPolygon::Radius。

有办法吗?

如果没有,将元组转换为RegularPolygon实例的最佳实践是什么?

最佳答案

我尝试为您的operator+重载operator<RegularPolygon:

struct RegularPolygon{
    int NbVertices;
    double Radius;

    RegularPolygon(int a, double b) : NbVertices(a), Radius(b) {};

    bool operator<(const RegularPolygon& o) { return (NbVertices < o.NbVertices && Radius < o.Radius); }
    RegularPolygon operator+(const RegularPolygon& o) { return RegularPolygon(NbVertices + o.NbVertices, Radius + o.Radius);}
};

并使用:
RegularPolygon first(1, 1.0);
RegularPolygon end(10, 10.0);
RegularPolygon step(1, 1.0);

INSTANTIATE_TEST_CASE_P(RegularPolygonTest,
                        PolygonTestCase,
                        ::testing::Range(::first, ::end, ::step));

10-05 22:27