为可变参数模板函数中的每个模板类型调用 void 函数?

2023-12-03

我的目标是编写一个简单的通用函数来注册任意 C++ 类型的转换器。为了简单起见,我将只打印 C++ 类型名称。我希望能够调用我的通用函数print_type_name适用于任何类型的函数,包括同时使用多种类型(可变参数):

template <typename T>
void print_type_name(void)
{
    std::cout << typeid(T).name() << std::endl;
}

这对于这样的事情效果很好:

print_type_name<int>();
print_type_name<std::string>();
print_type_name<std::vector<std::complex<float> > >();

但是,我需要能够为可变参数模板中的每种类型调用此函数,例如(展开时):

print_type_name<int, std::string, std::vector<std::complex<float> > >();

这是我想出的,但它相当笨重:

template <typename ...TS>
void noop(TS... ts) { }

template <typename T>
int real_print_type_name(void) {
    std::cout << typeid(T).name() << std::endl;
    return 0;
}

template <typename ...TS>
void print_type_name(void) {
    noop(real_print_type_name<TS>()...);
}

这允许以下操作:

template <typename ...TS>
void other_function(void) {
    print_type_name<TS...>();
}

注意无用的noop函数和int返回类型为real_print_type_name,为了扩展我必须添加这两个内容 参数包。有没有更干净的方法来做到这一点?


这是一个辅助函数。它使用随机的黑魔法,但它的名字很清楚:

void do_in_order() {}

template<class...Fs>
void do_in_order( Fs&&...fs ) {
  using discard=int[];
  (void)discard{0, (void(
    std::forward<Fs>(fs)()
  ),0)... };
}

或者在 C++17 中:

template<class...Fs>
void do_in_order( Fs&&...fs ) {
  (void(std::forward<Fs>(fs)())...);
}

(好多了)。

这隐藏了任何丑陋。需要一组void()可调用对象和调用 它们从左到右——它按顺序执行任务,就像罐头上写的那样。

Then print_type_names变成:

template<class...Ts>
void print_type_names() {
  do_in_order( print_type_name<Ts>... );
}

or

template<class...Ts>
void print_type_names() {
  do_in_order( [&]{
    std::cout << typeid(Ts).name() << std::endl;
  }... );
}

如果你不想使用单一print_type_name函数并想要内联它。

请注意,一些不合格的编译器抱怨将整个 lambda 扩展为....

活生生的例子

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为可变参数模板函数中的每个模板类型调用 void 函数? 的相关文章

随机推荐

  • Google OAuth API 获取用户的电子邮件地址?

    我正在使用我自己的个人 Google 帐户玩 Google 的 OAuth 2 0 Playground 但我似乎无法使用 Playground 恢复我的 Gmail 地址 我使用的范围是 email profile https www g
  • 如何将 WMI 日期时间转换为标准日期时间?

    我正在尝试从 WMI 读取安装日期 Win32 OperatingSystem InstallDate 返回值如下所示 20091020221246 000000 180 我怎样才能获得有效的日期 您可以使用WbemScripting SW
  • 仅针对最后一个系数的线性回归“NA”估计

    我正在 R 中运行 summary lm 函数 当我打印系数时 我会得到除最后一个变量之外的所有变量的估计值 我得到的最后一个变量是 NA 我尝试将最后一列数据与另一列进行交换 最后一列中的任何内容都得到 NA 但其他所有内容都得到了估计
  • 显示偶数后跟所有奇数

    下面写的代码是正确的 但我想缩短这段代码 用java编写一个程序 在一维数组中输入10个数字 并将它们排列成所有偶数后面都是奇数 int a new int 6 int b new int 6 int i j int k 0 System
  • 无法从 JS AJAX 将数据发送回 Django

    html javascript var csrftoken name csrfmiddlewaretoken val Save click function var ajaxdata exam Exam val ajax url save
  • 在 git 中创建别名

    我对 Git 很陌生 我正在尝试单步执行存储库中的提交 我没有为每次提交复制并粘贴 SHA 而是使用此方法获取 HEAD 之后的下一次提交 git checkout git rev list HEAD master tail n 1 这工作
  • 在 Flutter 中按降序排列 Firestore 文档?

    我想根据 Firestore 文档上传的时间戳按降序排列 我的意思是 当我上传新照片时 它应该出现在我制作的图像网格的顶部 这里我使用了 orderBy 并为参数降序传递了 true get images 方法中代码的底部 默认情况下它是
  • 如何裁剪非闭合几何体

    Intro 我在实现剪辑时注意到一个问题 请参阅this 看起来 UIElement Clip 仍然渲染不可见的部分 渲染相对较小的几何体 线条仅fill1920x1200区域 2000垂直线 需要很多时间 使用时Clip and movi
  • Pyspark DataFrameWriter jdbc 函数的忽略选项是否忽略整个事务或仅忽略违规行?

    皮斯帕克DataFrameWriter类有一个jdbc功能用于将数据帧写入 sql 这个函数有一个 ignore文档说的选项将 如果数据已经存在 则静默忽略此操作 但它会忽略整个事务 还是只会忽略插入重复的行 如果我结合起来会怎样 igno
  • android 中的 android:weightSum 是什么,它是如何工作的?

    我想知道 什么是 android weightSum 和布局权重 它们如何工作 添加 superM 和 Jeff 的答案 如果LinearLayout中有2个视图 第一个的layout weight为1 第二个的layout weight为
  • 集合属性应该是只读的

    我正在为我的 WPF MVVM 程序集使用 FxCop 它给了我错误 集合属性应该是只读的 但在我的属性中 我需要 RaisePropertyChangedEvent 现在如果我通过删除其设置部分将属性设置为只读 我如何引发此事件 语法有点
  • Twitter Bootstrap - 选项卡 - URL 不变

    我正在使用 Twitter Bootstrap 及其 选项卡 我有以下代码 ul class nav nav tabs li class active a href add add a li li a href edit edit a li
  • 向 UITableViewController 添加顶部/底部视图?

    在我的故事板中 我有 UITableViewController 它具有自定义类 如何在表格视图的顶部和底部添加 UIView 对象 我是否必须在 UIView 内创建 UITableView 和两个所需的视图 然后手动初始化我的控制器 设
  • 如何使 JScrollPane 中的垂直和水平滚动条居中?

    我有一个 JPanel 其中有一个 JLabel 已添加到 JScrollPane 中 我有一个调用的actionListenerJLabel setIcon file jpg 图像正确显示在 JScrollPane 中并且为全尺寸 滚动条
  • 日期.parse(2/4/2011 9:34:48 AM)

    我的输入将来自变量 Ticket CreationDate 看起来像 2 4 2011 9 34 48 AM 当然会有所不同 理想情况下 我可以按原样传递变量并获得不同的结果 喜欢 knownDateFunc Ticket DateCrea
  • htaccess errordocument 404 并将 url 传递给路径

    如何使用以下命令将 404 d URL 传递到我的 404 html 页面 htaccess 例如 如果我访问无效页面 user 123 RewriteEngine on RewriteCond REQUEST FILENAME f Rew
  • 根据列优先级选择记录

    首先 这个问题的标题很糟糕 但我没有找到更好的方法来描述我的问题 可能有一个非常简单的方法可以做到这一点 但我无法弄清楚 这非常类似于this问题 但我正在 sqlite3 iOS 上运行 所以我怀疑我的选择更加有限 我有一张包含产品记录的
  • PHP mySQL - 你能返回一个带有数字索引的关联数组吗?

    我的数据库类中有这个方法 public function query queryString if this gt connected this gt connectToDb connect to database results mysq
  • PS4 控制器 - 当值为 1 时光标不移动

    我试图编写程序来使用 PS4 控制器控制鼠标 一切正常 我获取数据并且可以相应地移动鼠标 然而 当我将操纵杆固定在任何轴上时 鼠标不会移动 这不仅在我握住它时发生 而且在操纵杆值没有改变时也会发生 有什么办法可以解决这个问题吗 import
  • 为可变参数模板函数中的每个模板类型调用 void 函数?

    我的目标是编写一个简单的通用函数来注册任意 C 类型的转换器 为了简单起见 我将只打印 C 类型名称 我希望能够调用我的通用函数print type name适用于任何类型的函数 包括同时使用多种类型 可变参数 template