C++ 所有模板实例的单一函数指针

2023-12-24

是否有一种简洁的方法可以在不使用宏的情况下指向模板化函数的所有实例?

我有几个模板化函数,我想在各种类型上测试它们:

template<typename T>
void function1() {
  return;
}

template<typename T>
void function2() {
  return;
}

template<typename T>
void function3() {
  return;
}

我可以用宏来做到这一点:

#define TEST_ACROSS_TYPES(fn) \
fn<int>();  \
fn<bool>(); \
fn<char>(); \
fn<double>(); \

TEST_ACROSS_TYPES(function1);
TEST_ACROSS_TYPES(function2);

但是,(1) 宏很难看,其他人很难理解,(2) 我正在使用CATCH,在使用宏设置测试用例时效果不佳。

有没有办法做这样的事情:

void testAcrossTypes(SomeType f) {
  f<int> ();
  f<bool> ();
  f<char> ();
  f<double> ();
}

除了定义问题之外,这看起来更干净SomeType。这个问题 (如何定义具有模板参数的函数指针的 typedef https://stackoverflow.com/questions/14848924/how-to-define-typedef-of-function-pointer-which-has-template-arguments) 解释如何定义指向模板函数的指针;但是,要求指定模板参数。


澄清一下:想象一下function1, function2, and function3每个测试不同的模板化函数。每个功能都需要测试int, byte, char, double等等。我想避免必须为每个函数显式设置许多(即 num_functions * num_types)测试。相反,我想要一个指向测试函数的单一方法(function1, function2等)并为每个模板类型运行它,从而巩固

function1<int>();
function1<byte>();
function1<char>();
function1<double();
...
function2<int>();
function2<byte>();
function2<char>();
function2<double();
...
function3<int>();
function3<byte>();
function3<char>();
function3<double();
...

每个测试函数只需调用一次

testAcrossTypes(function1);
testAcrossTypes(function2);
testAcrossTypes(function3);

你想要实现的目标

void testAcrossTypes(SomeType f) {
  f<int> ();
  f<bool> ();
  f<char> ();
  f<double> ();
}

如果SomeType可以是模板模板参数。但是,该标准不允许函数模板作为模板模板参数。

来自 C++11 标准:

14.3.3 模板模板参数

1 A 模板参数对于模板,模板参数应是类模板或别名模板的名称,表示为 id-expression。

最好的选择是使用函子而不是函数。例子:

template<typename T>
struct function1
{
   void operator()() {
      return;
   }
};

template<typename T>
struct function2
{
   void operator()() {
      return;
   }
};

template < template <typename> class F>
void testAcrossTypes() {
  F<int>()();
  F<bool>()();
  F<char>()();
  F<double>()();
}

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

C++ 所有模板实例的单一函数指针 的相关文章

随机推荐

  • Google Apps 脚本 - 从模板创建的每个文档中都出现“需要授权”

    我有一个 Google 文档 它有一个自定义 UI 菜单 其中包含一个选项 可以将新页面添加到文档并用一些数据填充它 我使用此文档作为模板 通过 Web 应用程序为单个用户创建许多其他文档 因此 我的用户来到我的 web 应用程序 单击生成
  • Boost::bind 和 Boost Phoenix::bind 有什么区别?

    Boost bind 和 Boost Phoenix bind 有什么区别 phoenix bind就好像lambda bind返回一个表达式模板的函数 该模板记录它必须调用给定的函数 它们被设计为分别与phoenix 和lambda 一起
  • 使用 jQuery 克隆

    我有一个允许用户推荐朋友的表格 我想在 朋友电子邮件 和 朋友姓名 这两个输入字段下方添加一个链接 该链接将克隆 朋友框 一次并将其添加到下面 另外 好友邮箱 和 好友姓名 的name属性为name friend email 0 and n
  • 如何将张量转换为字符串

    我正在测试 tf data 这是现在批量提供数据的推荐方法 但是 我正在加载自定义数据集 因此我需要 str 格式的文件名 但是当创建 tf Dataset from tensor slices 时 它们是 Tensor 对象 def lo
  • 根据列聚合过滤选定的列

    我希望仅选择唯一值少于 3 个的列 我可以通过生成布尔掩码pl all n unique lt 3 但我不知道是否可以通过 Polars API 使用该掩码 目前 我正在通过 python 解决这个问题 有更惯用的方法吗 import po
  • Logcat 消息在短时间内消失

    有时 eclipse logcat 消息在关闭应用程序一小段时间后就会消失 大多不会那么短 如何让它永远不会自动消失 编辑 我的设备仍然连接 以及如何将其设置为即使在设备断开连接并在下次启动之前清除后也显示日志 这也发生在我身上 设备已连接
  • Perl 正则表达式 'e' (eval) 修饰符带 s///

    我在理解 e 正则表达式修饰符的简单用法时遇到了一些困难 my var testing In this string we are var the e modifier s w 1 ee print 返回 在此字符串中 我们正在测试 e 修
  • 如何使用 DropDownList 的 SelectedIndexChanged 事件

    我有两个DropDownList在我的网络表单中 当我在第一个下拉列表中选择一个值时 我希望在第二个下拉列表中自动选择一个相关值 这就是我目前所拥有的 table tr td td tr table
  • 合并两个 Sass 文件

    我想即时将两个 sass 文件合并在一起 例如 如果我有 some class color white and some class background color red 那么最终结果将是 some class color white
  • 无法上传 > ~2GB 到 Google Cloud Storage

    追踪如下 相关的Python片段 bucket get bucket location bucket blob bucket blob location path blob upload from filename source path
  • 缩放用户控件中的裁剪像素

    我开发了一个用户控件 用户控件就像一个放大镜 用户控件有一个图像按钮 它显示逐像素裁剪的图像 StorageFile storageFile await StorageFile GetFileFromApplicationUriAsync
  • ASP.NET SimpleMembershipProvider 自动迁移

    因此 我尝试在新的 MVC 4 项目中使用自动迁移 但不知何故它不起作用 我关注了这篇博文 http blog longle net 2012 09 25 seeding users and roles with mvc4 simpleme
  • github 提交中的虚拟文件

    我正在尝试将一些更改推送到我的 github 存储库 但推送失败 因为 git 认为存储库中存在一个大文件 remote Error code 38865a38ccad9b1d9f394c35344906e6 remote warning
  • 使用 -viewWithTag: 当多个视图具有相同的 .tag 时,返回什么 UIView?

    假设我有 4 个 UIView 在 IB 中制作 所有标签属性 2 当我看到以下内容时 UIView thisView UIView self view viewWithTag 2 由于多个 UIView 具有相同的 tag 值 检索该 U
  • 如何使用窗口句柄更改窗口所有者

    我想制作一个 NET 表单作为另一个外部应用程序 与 NET 无关的纯 Win32 的最顶层表单 因此它保持在 Win32App 之上 但不在运行的其余应用程序之上 我有Win32App的句柄 由Win32App本身提供 并且我已经尝试过W
  • 使用“new”时未初始化的 std::complex 构造函数

    在分析我的程序时 我意识到 10 的代码都花在了愚蠢的事情上std complex
  • 使用gnuplot绘制进程树

    类似于这个问题here https stackoverflow com questions 20406346 how to plot tree graph web data on gnuplot我想绘制给定 PID 的进程树 我应该能够将该
  • Tkinter Treeview如何用鼠标正确选择多个项目

    我正在尝试使用鼠标选择和取消选择多个项目 我可以正常工作 但是当用户快速移动鼠标时会出现问题 当鼠标快速移动时 某些项目会被跳过并且根本不会被选择 我一定是以错误的方式处理这件事的 更新1 我决定使用自己的选择系统 但得到的结果与上面相同
  • 如何使用经典 ASP 页面从 Oracle 数据库读取 NCLOB、CLOB 数据值?

    我收到以下错误 Microsoft OLE DB Provider for Oracle 不支持数据类型 有人可以帮我解决这个问题吗 情况 最近将数据库从 SQL Server 2005 迁移到 Oracle 11g 其中一张表有一些 SQ
  • C++ 所有模板实例的单一函数指针

    是否有一种简洁的方法可以在不使用宏的情况下指向模板化函数的所有实例 我有几个模板化函数 我想在各种类型上测试它们 template