Оператори за достъп указател към член: .*
и ->*
Операторите за достъп от указател към член, .*
и ->*
, са за дерефериране на указател към член в комбинация с обект и указател към обект съответно. Това описание се отнася както за указатели към членове с данни, така и за указатели към членски функции.
Например, разгледайте класа Foo
:
struct Foo {
int i;
void f();
};
Ако декларирате указател на член, iPtr
, към член на данни int
от Foo
:
int Foo::* iPtr;
Можете да инициализирате този указател на член iPtr
, така че да сочи към члена Foo::i
:
iPtr = &Foo::i;
За да дереферирате този указател, трябва да го използвате заедно с обект Foo
.
Помислете сега за обекта foo
и указателя към обект fooPtr
:
Foo foo;
Foo* fooPtr = &foo;
След това можете да дереферирате iPtr
в комбинация с foo
или fooPtr
:
foo.*iPtr = 0;
fooPtr->*iPtr = 0;
Аналогично, можете да използвате .*
и ->*
с указатели към функционални членове. Имайте предвид обаче, че ще трябва да ги поставите в скоби, тъй като операторът за извикване на функция, т.е. ()
, има по-висок приоритет от .*
и ->*
:
void (Foo::*memFuncPtr)() = &Foo::f;
(foo.*memFuncPtr)();
(fooPtr->*memFuncPtr)();
В заключение: имате нужда от обект, за да дереферирате указател към член и кой от тях използвате, или .*
или ->*
за дерефериране на указателя към член, зависи от това дали този необходим обект е предоставен директно или чрез указател на обект.
C++17 — Използване на std::invoke()
вместо това
Използването на двата оператора може да бъде заменено от C++17 от std::invoke
a> функционален шаблон. std::invoke
предоставя унифициран начин за дерефериране на указатели на членове, независимо дали ги използвате в комбинация с обект или указател на обект, както и независимо дали указателят към член съответства на указател към член на данни или указател към членска функция:
// dereference a pointer to a data member
std::invoke(iPtr, foo) = 0; // with an object
std::invoke(iPtr, fooPtr) = 0; // with an object pointer
// dereference a pointer to a member function
std::invoke(memFuncPtr, foo); // with an object
std::invoke(memFuncPtr, fooPtr); // with an object pointer
Този унифициран синтаксис съответства на обикновения синтаксис за извикване на функция и може да улесни писането на общ код.
person
眠りネロク
schedule
19.08.2020