dispatch — Разница между функциями func () и (* this) .func () в переполнении стека

Я работаю над другим кодом в C ++, и я нашел странный вызов определенной функции func(), Вот пример:

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

В чем разница между func() а также (*this).func()?

В каких случаях звонят func() а также (*this).func() будет выполнять другой код?

В моем случае, func() это не макрос. Это виртуальная функция в базовом классе, с реализацией как в базовом, так и в производном классе, и без func(), if находится в методе в базовом классе.

59

Решение

На самом деле есть разница, но в очень нетривиальном контексте. Рассмотрим этот код:

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;

Теперь, если мы позвоним t.f(), первая строка test::f вызовет свободную функцию funcпока вторая строка будет звонить derived::func,

47

Другие решения

Невозможно сказать из фрагмента, но, возможно, есть два вызываемые объекты называется func(), (*this).func(); гарантирует, что функция-член вызывается.

вызываемый объект может быть (например) functor или lambda выражение:

функтор

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
31

Другой случай, когда эти две строки будут вызывать разные функции:

#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();
}
17

В зависимости от типа имя может отличаться:

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
}
};

демонстрация

12
По вопросам рекламы [email protected]