Есть ли способ назначить указатель на член класса, чтобы он указывал на сам класс?
Это фактически означало бы, что результатом применения указателя на экземпляр класса будет ссылка на тот же экземпляр.
например:
struct SFoo {};
constexpr SFoo SFoo::* MP_foo = &SFoo:: MYSELF;
// Is there some syntax I can use here? --^
Причина, по которой я этого хочу, заключается в том, что у меня есть алгоритм сортировки, который работает с контейнером элементов произвольного типа шаблона. Ключ сортировки получается из каждого элемента с использованием предоставленного указателя на член.
Тем не менее, теперь я хочу отсортировать контейнер, где элемент также ключ. Таким образом, мне нужно сделать так, чтобы указатель на член указывал на себя (как если бы класс был его собственным членом).
Есть несколько простых (и с нулевой стоимостью) хаков, которые я могу использовать (и я использую один сейчас), но я хочу знать, есть ли какой-то синтаксический трюк, который я могу использовать, чтобы сделать это право способ — избегать лишних лишних кодов.
К сожалению, вопрос не очень понятен (но -1 не мое). У меня сложилось впечатление, что вы путаете тип объекта, который должен быть отсортирован (в вашем случае это SFoo), и тип ключа сортировки. В типичной ситуации они разные. Пример: сортируемые пользователи (объект), а ключ сортировки — это имя и фамилия (пара строк). Вы не указали тип ключа сортировки напрямую.
Синтаксически SFoo SFoo::* MP_foo
указатель на поле экземпляра, тип которого SFoo. C ++ не допускает этого, потому что в противном случае это приведет к бесконечной рекурсии. В этом поле будет храниться SFoo, и это внутреннее поле должно будет иметь это поле снова.
Во-вторых, вы пытаетесь инициализировать указатель на данные с помощью указателя на функцию. Конструктор SFoo::SFoo
это функция. И, как упоминается в комментариях, адреса ctors не допускаются.
Еще одна попытка: Применение указателя члена к экземпляру класса будет ссылкой на тот же экземпляр.
Указатель на участника указывает на участника. Объект не является его членом. Хорошо это или плохо — так определяется C ++.
Вы можете попытаться определить класс-оболочку, например:
struct SFoo2
{
SFoo m_data_field;
};
Обратите внимание, что с точки зрения расположения памяти они будут идентичны. SFoo2
может иметь указатель на член типа SFoo
, Я не уверен, будет ли это работать в вашем контексте, но вы можете попробовать.
Других решений пока нет …