c++ - 有没有办法创建一个以成员函数或成员为参数的函数?
问题描述
我有这样的功能:
void f(std::ofstream& ostrm)
{
auto a = Myglobal->getData1();
ostrm << a;
auto b = Myglobal->getData2();
ostrm << b;
auto c = Myglobal->m_data1;
ostrm << c;
auto d = Myglobal->m_data2;
ostrm << d;
//...
auto z = Myglobal->getData1000();
ostrm << z;
}
有没有办法创建一个函数,该函数将成员函数或成员作为参数来分解此代码?
( a
, b
, c
, d 和z
不是同一类型)
解决方案
就在这里。一种方法是void f
变成函数模板,然后将指针传递给所需数据成员或成员函数的成员,然后让std::invoke
(C++17, <functional>
header) 完成其余的工作:
template <class PtrToMember>
void f(std::ofstream &ostrm, PtrToMember m){
ostrm << std::invoke(m, Myglobal);
}
// call like this:
f(someStream, &T::getData1);
f(someStream, &T::m_data1);
你应该用当然T
的类型替换Myglobal
。好处std::invoke
是它会自动处理所有成员(数据或函数)。
推荐阅读
- python - 如何实现具有特殊误差函数和惩罚的梯度下降
- node.js - 节点 JS 部署到 Azure Web 应用服务错误 - “您无权查看此目录或页面。”
- matlab - 如何使用 Matlab 将抽取的图像内插 2 倍?
- android - Android:应用程序退出后应用程序未由 AlarmManager 启动
- c# - 迭代 ASP.net 时仅使用部分数据库 - 遍历整个数据库会减慢它的速度
- firebase - 使用 FCM 按主题进行 Flutter 推送通知
- go - golang函数类型继承?
- flutter - 无法从 ../url.png 文件中加载图像
- deep-learning - 使用 nn.Sequential() 方法 + Pytorch 编写 dropout 层
- c# - EF Code First 6.1 将 PK 密钥从 int 更改为 long