2016-11-22 3 views
-1

Есть ли способ назначить элемент-указатель для класса, чтобы он указывал на сам класс?присвоение «указателю на член» для себя

Это фактически означает, что результат применения указателя-члена к экземпляру класса будет ссылкой на тот же самый экземпляр.

например:

struct SFoo {}; 

constexpr SFoo SFoo::* MP_foo = &SFoo:: MYSELF; 
// Is there some syntax I can use here? --^ 

Причина Я хочу это у меня есть алгоритм сортировки, который работает на контейнер элементов произвольного типа шаблона. Ключ сортировки получается из каждого элемента, используя поставляемый указатель на элемент.

Однако, теперь я хочу сортировать контейнер, в котором находится элемент также ключ. Таким образом, мне нужно сделать точку-указатель на себя (как будто класс был его собственным членом).

Есть несколько простых (и нулевую стоимость) писак я могу использовать (и я использую его сейчас), но я хочу знать, если есть какой-то синтаксический трюк я могу использовать, чтобы сделать это право путь - чтобы избежать лишнего неэлегантного кода.

+6

Это не имеет никакого смысла. Указатель на член класса является указателем на член класса. Это то, что делает его указателем на член класса, а не указателем на что-то еще, как экземпляр самого класса. Я упоминал, что это указатель на члена класса? –

+2

Вы не можете принять адрес конструктора – Danh

+2

Это [XYproblem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), и я думаю, вам лучше объяснить Y , то есть зачем вам это нужно (какая-то сортировка, да, но какая именно сортировка) и показать, что «легкие (и нулевые затраты) хаки» вы упоминаете. В чем проблема с ними?Почему вы не хотите использовать их, если они легкие и нулевые? – user463035818

ответ

1

К сожалению, вопрос не очень ясен (но -1 не мой). Мое впечатление, что вы путаете тип объекта, который должен быть отсортирован (в вашем случае это SFoo) и тип ключа сортировки. В типичной ситуации они разные. Пример: пользователи для сортировки (объект) и ключ сортировки - это имя и фамилия (пара строк). Вы не указываете тип ключа сортировки напрямую.

Синтаксически SFoo SFoo::* MP_foo является указателем на поле экземпляра, тип которого является SFoo. C++ не позволяет этого, потому что иначе это приведет к бесконечной рекурсии. Это поле будет иметь SFoo, и это внутреннее поле должно будет снова заполнить это поле.

Во-вторых, вы пытаетесь инициализировать указатель на данные указателем на функцию. Конструктор SFoo::SFoo является функцией. И, как упоминается в комментариях, адреса ctors не допускаются.

Еще одна попытка: Применение указателя-члена к экземпляру класса будет ссылкой на тот же самый экземпляр.

Указатель членов указывает члену. Объект не является его членом. Хорошо или плохо, так определяется C++.

Вы могли бы попытаться определить класс-оболочку, что-то вроде:

struct SFoo2 
{ 
    SFoo m_data_field; 
}; 

Обратите внимание, что с точки зрения размещения в памяти они будут идентичны. SFoo2 может иметь указатель на элемент типа SFoo. Я не уверен, что это будет работать в вашем контексте, но вы можете попробовать.

+0

Я думаю, что ответ - это просто «нет». Но можете ли вы сказать мне, какая часть вопроса непонятна, поэтому я могу это исправить? // В случае отсортированного объекта _is_ ключ. Это похоже на то, что вы сортируете набор строк по их значению, а не по объектам, содержащим строки. Тем не менее мой код сортировки написан с указателями-членами. // SFoo :: SFoo означает ctor (обычно), но я чувствовал, что это лучший способ передать мое намерение. – xaxazak

+0

Сделал некоторые разъяснения, надеюсь, в правильном направлении. – xaxazak

+0

Присвоение этого ответа, потому что «Указатель на член указывает на член. Объект не является его членом. Хорошо или плохо, так определяется C++». В принципе, я не убежден, что с этим можно будет что-то не так, (саморегуляция и саморекурсивность не являются проблемой AFAICT), но, поскольку это так, это не реализовано. – xaxazak