Как мне отправить указатель ‘this’ на функцию, не используя ‘instance.function ()’?

#c #oop

Вопрос:

Могу ли я отправить экземпляр функции без использования . оператора?

Например:

 // header file
class A 
{
public:
    void foo() {std::cout << "Hello" << std::endl;}
};
 
 // main file
A instance = new A;
instance.foo();
// instead do something like this
A::foo(instance);
 

Могу ли я сделать что-то подобное?

Комментарии:

1. Вам нужно будет изменить функцию на be static и принять a A* в качестве аргумента. Вы пробовали это делать?

2. Если только это не должно быть a A* в вашем «основном файле» — это неясно, потому что у вас есть некомпилируемый код в этом фрагменте

3. мой вопрос в том, могу ли я отправить экземпляр его методу без использования . оператор

4. Ну, вы могли бы написать (instance.*amp;A::foo)() , и это было бы operator .* , а не . , или если вы действительно ненавидите периоды std::invoke(amp;A::foo, instance) . Но все это довольно глупо, так что же вы на самом деле пытаетесь сделать?

5. @reem_mikulsky A instance = new A; instance.foo(); не компилируется. Вам нужно было бы использовать либо A instance; instance.foo(); или A *instance = new A; instance->foo(); delete instance; вместо этого.

Ответ №1:

Да, вы можете косвенно через std::invoke :

 #include <functional>
#include <iostream>

struct A {
  void foo() {
    std::cerr << "hin";
  }
};

int main() {
  A a;
  std::invoke(amp;A::foo,a);
}
 

Но std::invoke реализация But ‘s, вероятно, просто применит .* оператор.

Ответ №2:

Вы более чем можете использовать синтаксис указателя на элемент.

 A instance;
auto fn = amp;A::foo;
(instance.*fn)();
 

.* это другой оператор , чем . . Является ли это более читабельным, остается в качестве упражнения для читателя (подсказка: это не так).