作者:朱永红2602897625 | 来源:互联网 | 2022-12-06 16:56
我正在使用TYPED_TEST
google测试功能编写测试,这使我可以将测试推广到多种类型.我正在测试类型int
和类的类模板double
.在测试中,我需要生成随机数.为此,我尝试使用std::uniform_int_distribution
和std::uniform_real_distribution
但是遇到了静态断言.
如名称所示,std::uniform_int_distribution
检查if T
是否为整数类型并std::uniform_real_distribution
检查T
是否为浮点类型.
由于我的测试自动测试int
然后测试double
,我一直在尝试编写某种函数,这将允许我在编译时为类型选择正确的类型.更确切地说,类似于:
template
Distribution get_right_distribution(const T& a, const T& b)
{
if(T is integral) // Compile time is needed, runtime
// fails since both if and else have to compile
{
return std::uniform_real_distribution(a, b);
}
else
{
return std::uniform_real_distribution(a, b);
}
}
请注意,这只是我试图做的伪代码.这种逻辑分支失败,因为if
AND else
必须编译.
我已经做了一些研究如何做到这一点,我觉得std::is_integral
并且std::is_floating_point
是解决方案的一部分,但到目前为止我还没有能够编译任何东西.我主要尝试了两件事:
使用模板专业化创建一种编译时间.
使用enable_if
.
使用第一种方法,我最终得到一条错误消息,告诉我我的重载是模棱两可的.使用第二种方法,我尝试了一些东西,但却迷失了恶劣的语法(至少对于那些不习惯它的人来说).
你有关于如何实现这一目标的建议吗?
PS我想知道如何做到这一点,所以将我的测试分成两部分对我来说不是一个可接受的答案.
1> dfri..:
C++ 17
我可以使用C++ 17,你可以使用if constexpr(...)
:
#include
#include
#include
template
auto get_right_distribution(const T a, const T b) {
if constexpr(std::is_integral::value) {
return std::uniform_int_distribution(a, b);
}
else {
return std::uniform_real_distribution(a, b);
}
}
int main() {
std::random_device rd;
std::mt19937 gen(rd());
auto int_dis = get_right_distribution(1, 6);
std::cout <
C++ 11和C++ 14
对于C++ 11和C++ 14,您可以在模板参数列表中使用条件额外模板类型参数来选择返回类型和分布.
C++ 11:
template ::value,
std::uniform_int_distribution,
std::uniform_real_distribution>::type>
Distribution get_right_distribution(const T a, const T b) {
return Distribution(a, b);
}
C++ 14(由辅助类型简短形式推导auto
并使用的返回类型):std::conditional_t
std::conditional<...>::type
template ::value,
std::uniform_int_distribution,
std::uniform_real_distribution>>
auto get_right_distribution(const T a, const T b) {
return Distribution(a, b);
}