func()和(* this).func()在C ++中的区别

我正在使用C ++编写别人代码,并且发现了一个奇怪的调用函数func() 。 这里是一个例子:

 if(condition) func(); else (*this).func(); 

func()(*this).func()之间有什么区别?

什么情况下调用func()(*this).func()将执行不同的代码?

在我的情况下, func()不是一个macros。 它是基类中的一个虚函数,在基类和派生类中都有一个实现,没有自由的func()if位于基类中的一个方法中。

实际上有一个区别,但在一个非常平凡的背景下。 考虑这个代码:

 void func ( ) { std::cout << "Free function" << std::endl; } template <typename Derived> struct test : Derived { void f ( ) { func(); // 1 this->func(); // 2 } }; struct derived { void func ( ) { std::cout << "Method" << std::endl; } }; test<derived> t; 

现在,如果我们调用tf()test::f的第一行将调用自由函数func ,而第二行将调用derived::func

从片段中不可能看出来,但是可能有两个 可调用的对象叫做func()(*this).func(); 确保调用成员函数。

可调用的对象可以是(例如)一个functorlambdaexpression式:

函子

 struct func_type { void operator()() const { /* do stuff */ } }; func_type func; // called using func(); 

拉姆达

 auto func = [](){ /* do stuff */ }; // called using func(); 

例如:

 #include <iostream> class A { public: // member void func() { std::cout << "member function" << '\n'; } void other() { // lambda auto func = [](){ std::cout << "lambda function" << '\n'; }; func(); // calls lambda (*this).func(); // calls member } }; int main() { A a; a.other(); } 

输出:

 lambda function member function 

另一种情况下,这两行将调用不同的function:

 #include <iostream> namespace B { void foo() { std::cout << "namespace\n"; } } struct A { void foo() { std::cout << "member\n"; } void bar() { using B::foo; foo(); (*this).foo(); } }; int main () { A a; a.bar(); } 

与types相关的名称,可能会有所不同:

 void func() { std::cout << "::func()\n"; } struct S { void func() const { std::cout << "S::func()\n"; } }; template <typename T> struct C : T { void foo() const { func(); // Call ::func (*this).func(); // Call S::func } }; 

演示