在编译时选择随机数分布

2023-12-12

我正在使用编写测试TYPED_TEST谷歌测试的功能,它允许我将测试推广到多种类型。我正在测试类型的类模板int and double。在测试中,我需要生成随机数。为此,我尝试使用std::uniform_int_distribution<T>std::uniform_real_distribution<T>但遇到了静态断言。

正如名字所示,std::uniform_int_distribution<T>检查是否T是一个整型并且std::uniform_real_distribution<T>检查T是浮点类型。

由于我的测试会自动测试int然后对于double,我一直在尝试编写某种函数,使我能够在编译时为该类型选择正确的分布类型。更准确地说,类似于:

template<class T>
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);
    }
}

请注意,这只是我一直在尝试做的伪代码。这种逻辑分支失败的原因是ifelse必须编译。

我已经做了一些关于如何做到这一点的研究,我觉得std::is_integral<T> and std::is_floating_point<T>是解决方案的一部分,但到目前为止我还无法编译任何内容。我主要尝试了两件事:

  1. 通过使用模板专门化来创建一种编译时间。
  2. Use enable_if.

使用第一种方法时,我最终收到一条错误消息,告诉我我的重载不明确。使用第二种方法,我尝试了一些东西,但迷失在它导致的令人讨厌的语法中(至少对于不习惯它的人来说)。

您对如何实现这一目标有什么建议吗?

附:我想看看如何做到这一点,因此将我的测试分成两部分对我来说不是一个可接受的答案。


C++17

我你可以使用C++17,你可以使用if constexpr(...):

#include <iostream>
#include <random>
#include <type_traits>

template <typename T>
auto get_right_distribution(const T a, const T b) {
    if constexpr(std::is_integral<T>::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 << int_dis(gen) << "\n";

    auto float_dis = get_right_distribution(1.F, 6.F);
    std::cout << float_dis(gen) << "\n";
}

C++11 和 C++14

对于 C++11 和 C++14,您可以在模板参数列表中使用条件额外模板类型参数来选择返回类型和分布。

C++11:

template <typename T,
          typename Distribution = typename std::conditional<
              std::is_integral<T>::value, 
              std::uniform_int_distribution<T>,
              std::uniform_real_distribution<T>>::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 <typename T,
          typename Distribution = typename std::conditional_t<
              std::is_integral<T>::value, 
              std::uniform_int_distribution<T>,
              std::uniform_real_distribution<T>>>
auto get_right_distribution(const T a, const T b) {
    return Distribution(a, b);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编译时选择随机数分布 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 使用数组中的参数调用函数 - apply() 而不使用上下文参数?

    是否有任何方法可以调用函数但设置上下文this当我通过执行以下操作调用该函数时它具有的 默认 值fn 此方法应该接受一个数组并将单个元素作为参数传递给函数 就像 apply 所做的那样 emitter new EventEmitter ar
  • 什么是 RSA 主机密钥?

    我收到这条消息说 将 IP 地址 192 30 252 130 的 RSA 主机密钥永久添加到已知主机列表中 RSA 密钥的含义是什么以及已知主机背后的概念是什么 RSA密钥是基于RSA算法的私钥 私钥用于在建立 SSL TLS 会话期间进
  • Rails:查询按除 0 之外的数字对记录进行排序

    我根据优先级 升序 排列数据 其中 0 在优先级中被忽略 下面是 Rails 查询 Profile where active true order priority pluck priority 此查询返回优先级从 0 开始的有序记录列表
  • geom_tile 图的可变大小

    I have a code that takes in positional data as well as values at that positional data and then plots it with geom tile T
  • 从连接到 Google Functions 的端点调用时,Firebase ID 令牌具有不正确的“aud”(受众)声明

    我使用 Google Endpoints 作为 API 网关 该网关在 Google Run 容器服务中运行 API 路径指向 Google 函数 node js 对 API 网关的调用来自 Web 应用程序 即浏览器 其中一条路径是 lo
  • 在 asset:install 和 assetic:dump 之后,Fontawesome 字体失败

    我正在尝试建立一个我正在共享托管上工作的网站 一切正常 但 FontAwesome 图标 因为 Symfony 找不到它们应该在的位置 我按照以下步骤将网站移动到生产共享托管 由于 SH 不允许符号链接 因此将资产发布为硬拷贝 因此我运行此
  • 根据权重分布从列表中随机选择 N 个项目的最快算法是什么?

    我有一个很大的物品清单 每个物品都有一个重量 我想随机选择N个项目而不放回 而权重较大的项目更有可能被选择 我正在寻找最有效的想法 性能至关重要 有任何想法吗 如果你想样品项目无需更换 你有很多选择 使用加权选择替换算法来选择随机索引 有很
  • JTabel 单个单元格文本对齐

    基本上我有一个JTable 和这个JTabel将在一个单元格中包含一种产品 然后在其正下方的单元格中包含成本 产品名称应左对齐 产品成本应向右对齐 我实际上并不关心每行中其他单元格的对齐方式 所以我需要设置单个单元格或单个行的对齐方式 我找
  • Python中无效证书获取证书信息

    我正在编写一个 Python 2 7 13 Win x64 脚本来验证 SSL 证书并发出问题警报 但是 我遇到了一个问题 即仅当证书有效时脚本才会返回信息 如果证书无效 我会收到 CERTIFICATE VERIFY FAILED SSL
  • 替换文本中的一个字符

    如何用 2B 替换 这是我的代码 x lt asflj ldjjsf ljsdlafj gsub 2B x 我的输出是 2Ba 2Bs 2Bf 2Bl 2Bj 2B 2B 2B 2Bl 2Bd 2Bj 2Bj 2Bs 2Bf 2B 2Bl
  • “libRestKit.a,文件是为存档而构建的,不是正在链接的架构(armv7)”

    我正在尝试使用 xcodebuild 来构建项目 但是RestKit and GPUImage给出以下问题 ld 警告 忽略文件 project libGPUImage a 文件 project libGPUImage a 2个切片 中缺少
  • 应用程序服务器如何将 Google 帐户与用户设备关联?

    我希望用户能够从网络服务器和 或本机 PC 应用程序输入数据 并将其传输到他们选择的 Android 设备 就像 Google Play 在设备上安装的方式一样 我想使用用户的 Google 帐户验证在应用程序服务器和向 GCM 注册的用户
  • 在地图上绘制线条 - gcIntermediate

    我的代码可以很好地生成从 A 点到 B 点的地图和线条 但是对于远东半球的国家 该线尝试穿过最短路径 例如从澳大利亚向东 并中断以创建一条穿过地块的直线 有什么建议么 我缩短了代码并将其全部包含在下面以供使用 有人提到 在代码的链接中 使用
  • 配置django与Oracle 11g数据库问题

    使用 Django 进行 Oracle 数据库配置 并在迁移应用程序时遇到错误 django db migrations exceptions MigrationSchemaMissing 无法 创建 dja ngo migrations
  • 使用进程将数据发送到记事本

    我想将列表框中的每个项目发送到记事本 但我的逻辑有点打败我 private void send Click object sender EventArgs e var notepad Process GetProcessesByName N
  • 为什么 random.shuffle 返回 None ?

    Why is random shuffle返回None在Python中 gt gt gt x foo bar black sheep gt gt gt from random import shuffle gt gt gt print sh
  • 可以用SQL在数据库中进行二分查找吗?

    好的 我正在使用 C 编程语言访问一个简单的数据库 在 Microsoft SQL Server 上 目前 我正在使用 DataReader 对象来访问数据库 所以这是我的问题 是否可以对特定的数据进行二分搜索 在 C 中 以便我可以加快搜
  • Symfony2 - 如何从我的网址中删除“web/app_dev.php/”?

    当我希望我的 symfony 网站上线时 如何从我的网址中删除 web app dev php 这是开发时的默认url http localhost my symfony 2 web app dev php hello World 所以当我
  • NSMutableArray indexOfObject 返回一个非常大的数字

    我有一个 NSMutableArray 返回一个非常大的索引 po masterArray count lt returns 2 NSUInteger theIndex masterArray indexOfObject validateE
  • 在编译时选择随机数分布

    我正在使用编写测试TYPED TEST谷歌测试的功能 它允许我将测试推广到多种类型 我正在测试类型的类模板int and double 在测试中 我需要生成随机数 为此 我尝试使用std uniform int distribution