@ lubgr объясняет использование std::invoke
. Еще одним шагом вы можете сократить все строки кода до одной строки, используя сложенное выражение из c ++ 17 .
template<typename... Mems>
void f(std::ofstream& ostrm, Mems&&... args)
{
((ostrm << std::invoke(args, Myglobal) << " "), ...);
}
и вы передадите нужные функции или функции-члены в функцию сразу, а не вызовете ее много раз.
f(obj,
&MyClass::m_data1, &MyClass::m_data2, &MyClass::m_data3,
&MyClass::getData1, &MyClass::getData2, &MyClass::getData3);
( См. Пример в реальном времени )
И, предоставив еще один параметр шаблона в функции f
(для Class
), вы можете сделать его полностью универсальным кодом и не требовать глобальных переменных.
template<typename Class, typename... Mems>
void f(std::ofstream& ostrm, const Class& obj, Mems&&... args)
// ^^^^^^^^^^^^^^^^
{
((ostrm << std::invoke(args, obj) << " "), ...);
}
а теперь в main()
std::ofstream ostrm{"test_file.txt"};
const auto obj{ std::make_unique<MyClass>() };
f(ostrm,
obj,
&MyClass::m_data1, &MyClass::m_data2, &MyClass::m_data3,
&MyClass::getData1, &MyClass::getData2, &MyClass::getData3);