我试图弄清楚如何在调用函数时执行操作,例如:
ExampleClass eco;
eco.DoStuff();
在eco.DoStuff()
点,我想要登录文件。
我试图通过重载运算符获得某些东西,但没有运气?
E.g。
void operator>>(ExampleClass eco, std::function<void(void)> DoStuff)
{
//Perform logging into a file
DoStuff;
}
int main()
{
ExampleClass eco;
std::function<void(void)> func_pointer = std::bind(&ExampleClass::DoStuff, &eco, 2);
eco >> func_pointer;
}
这样做有效,但我无法为DoStuff
使用灵活参数,因为必须在func_pointer
中明确设置。
此外,为我班中的每一个方法创建函数指针都不是一个选项。
最好的方法是什么?
答案 0 :(得分:2)
如何为输出运算符使用模板化定义?
template<typename Function>
void operator>>(ExampleClass eco, Function DoStuff)
{
//Perform logging into a file
DoStuff();
}
此方法的一个可能变体是为operator>>
重载提供仿函数,将eco
作为左值参数:
template <typename MemberCall>
ExampleClass& operator>>(ExampleClass& eco, MemberCall mem_call){
eco.log();
mem_call(eco);
return eco; // returned lvalue eco allows chaining
}
通过创建一个辅助函数将成员函数指针和参数转换为带有ExampleClass
左值参数的仿函数,可以提高易用性:
template <typename MemberFunctionType, typename...Args>
auto member_call(MemberFunctionType mem_fn, Args&&...args){
return [=](ExampleClass& object){
return (object.*mem_fn)(args...);
};
}
像这样使用:
eco
>> member_call(&ExampleClass::DoStuff, 2)
>> member_call(&ExampleClass::DoStuff, 4);
应该注意的是,如果member_call
返回lambdas,那么你应该为这个结构提供一个无效参数可能不错。如果它成为问题,创建和返回自定义函子类型可能会改善错误消息质量。