如何解决键入谷歌测试,组合类型,C++
我正在使用 google test 来测试我的 C++ 库,该库执行像素转换和其他操作。
现在考虑我让这些模型参与测试。
using Models = testing::Types<ARGBNormalized,RGBNormalized,HSLNormalized,HSVNormalized,YUVNormalized,YCCNormalized>;
当我需要测试转换时,我需要来自这些类型的两个不同的模型。
所以我创建了一个这样的结构。
template<typename Source,typename Dest>
struct ConversionTypes{
using SourceModelType = Source;
using DestModelType = Dest;
};
然后添加这个。
using ConversionModels = testing::Types<ConversionTypes<ARGBNormalized,YCCNormalized>.....>;
如果模型的计数是 n
,我将不得不在转换模型列表中写入 n*(n-1)
类型。如果我有 4 个或 3 个颜色的模型并不重要,但我的程序中将有 10 个以上的模型,手工编写 90 个组合是疯狂的。
那么有没有办法 tp 以某种方式从我已经写过的 ConversionModels
中生成这些 Models
?
解决方法
对于 Boost.Mp11,只需要一点额外的谓词。我们可以这样写转换:
#include <type_traits>
#include <gtest/gtest.h>
#include <boost/mp11/algorithm.hpp>
template<typename Source,typename Dest>
struct ConversionTypes {
using SourceModelType = Source;
using DestModelType = Dest;
};
template<typename> struct SameConversionTypes : std::false_type{};
template<typename T> struct SameConversionTypes<ConversionTypes<T,T>> : std::true_type{};
using Models = ::testing::Types<char,int,long,long long>;
using ConversionModels =
boost::mp11::mp_remove_if<
boost::mp11::mp_product<ConversionTypes,Models,Models>,SameConversionTypes
>;
mp_product
将 ConversionTypes
应用到列表 Models
与其自身的笛卡尔积。结果在与 Models
相同的列表中产生。所以我们得到一个::testing::Types<ConversionTypes<...>...>
。但是,由于您不想测试身份转换,因此我们使用 mp_remove_if
去除形式 ConversionTypes<T,T>
的所有元素(这是我们为其定义的辅助谓词 SameConversionTypes
) .
话虽如此,虽然这适用于 GoogleTest 主干,但上述方法可能对您无效。那是因为 google test 仅在过去 18 个月左右才切换到使用 Types
的可变参数模板。在此之前,它生成了一个 testing::Types
模板,该模板采用了大量参数(以模拟旧编译器的可变参数模板)。如果您使用的 GoogleTest 版本稍旧,那么您仍然可以依靠 boost::mp11
来完成,只需稍作改动即可。
using Models_ = boost::mp11::mp_list<char,long long>;
using Models = boost::mp11::mp_rename<Models_,::testing::Types>;
using ConversionModels =
boost::mp11::mp_rename<
boost::mp11::mp_remove_if<
boost::mp11::mp_product<ConversionTypes,Models_,Models_>,SameConversionTypes
>,::testing::Types
>;
mp_list
是一个真正的可变参数类型列表。所以我们可以用它来定义一切,然后用mp_rename
来代替“外壳”。它将 mp_list<A,...,Z>
变成 ::testing::Types<A,Z>
。
唯一需要注意的是要注意 GTest 的实现限制。它可能不支持长度为 90 个类型的类型列表。您可能需要在本地重新生成标头以增加它可以支持的类型数量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。