使用重载运算符在函数调用时执行操作?

时间:2017-01-30 18:43:29

标签: c++ operator-overloading

我试图弄清楚如何在调用函数时执行操作,例如:

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中明确设置。

此外,为我班中的每一个方法创建函数指针都不是一个选项。

最好的方法是什么?

1 个答案:

答案 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,那么你应该为这个结构提供一个无效参数可能不错。如果它成为问题,创建和返回自定义函子类型可能会改善错误消息质量。