首页 > 解决方案 > 有没有办法创建一个以成员函数或成员为参数的函数?

问题描述

我有这样的功能:

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不是同一类型)

标签: c++templatesc++17membermember-functions

解决方案


就在这里。一种方法是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是它会自动处理所有成员(数据或函数)。


推荐阅读