#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
и принять aA*
в качестве аргумента. Вы пробовали это делать?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)();
.*
это другой оператор , чем .
. Является ли это более читабельным, остается в качестве упражнения для читателя (подсказка: это не так).