Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型化google测试,组合类型,c++;_C++_Templates_Types_Googletest_Generate - Fatal编程技术网

C++ 类型化google测试,组合类型,c++;

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>; 使用模型=测试::类型; 当我需要测试转换时,我需要从这些类型中选择两个不同的模型 所以我创

我正在测试我的C++ LIB,它做像素转换和其他事情。 现在考虑我有这些模型参加测试。

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