C++ 类型化google测试,组合类型,c++;
我正在测试我的C++ LIB,它做像素转换和其他事情。 现在考虑我有这些模型参加测试。C++ 类型化google测试,组合类型,c++;,c++,templates,types,googletest,generate,C++,Templates,Types,Googletest,Generate,我正在测试我的C++ LIB,它做像素转换和其他事情。 现在考虑我有这些模型参加测试。 using Models = testing::Types<ARGBNormalized, RGBNormalized, HSLNormalized, HSVNormalized, YUVNormalized, YCCNormalized>; 使用模型=测试::类型; 当我需要测试转换时,我需要从这些类型中选择两个不同的模型 所以我创
using Models = testing::Types<ARGBNormalized, RGBNormalized, HSLNormalized,
HSVNormalized, YUVNormalized, YCCNormalized>;
使用模型=测试::类型;
当我需要测试转换时,我需要从这些类型中选择两个不同的模型
所以我创建了一个这样的结构
template<typename Source, typename Dest>
struct ConversionTypes{
using SourceModelType = Source;
using DestModelType = Dest;
};
模板
结构转换类型{
使用SourceModelType=Source;
使用DestModelType=Dest;
};
然后再加上这个
using ConversionModels = testing::Types<ConversionTypes<ARGBNormalized,YCCNormalized>.....>;
使用ConversionModels=testing::Types;
如果模型的计数为n
,则我必须在转换模型列表中写入n*(n-1)
类型。不管我喜欢4色还是3色的模型,但我的程序中会有10+个模型,手工编写90个组合是疯狂的。
那么tp是否有办法从我已经编写的模型中生成这些转换模型
?,只需要一点额外的谓词。我们可以按如下方式编写转换:
#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\u列表
是一个真正的可变类型列表。所以我们可以用它来定义一切,然后用mp\u rename
来替换“外壳”。它将mp\u列表
转换为::测试::类型
唯一需要注意的是要注意GTest的实施限制。它可能不支持90个类型的类型列表。您可能需要在本地重新生成标头,以增加它可以支持的类型数。使用,只需要一点额外的谓词。我们可以按如下方式编写转换:
#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\u列表
是一个真正的可变类型列表。所以我们可以用它来定义一切,然后用mp\u rename
来替换“外壳”。它将mp\u列表
转换为::测试::类型
唯一需要注意的是要注意GTest的实施限制。它可能不支持90个类型的类型列表。您可能需要在本地重新生成标头,以增加其支持的类型。不幸的是,我没有使用boost,幸运的是,我没有使用boost