Эффективный указатель на целочисленное отображение и поиск в C ++ - PullRequest
2 голосов
/ 03 сентября 2010

Я хочу отобразить указатель на целое число с целью сериализации. Указатели могут быть разных типов и могут указывать на полиморфные объекты, возможно, использующие множественное наследование. Мне нужно запросить карту, чтобы узнать, хранится ли в ней указатель, и если это так, то каково связанное интегральное значение.

Как правильно это сделать?

Простой способ map<void*, int>, о котором я думал, не сработает, потому что operator < не определен для произвольных указателей. Или это не проблема в обычных системах?

Другое решение будет иметь vector<void*>. Но для этого потребуется зациклить все указатели, хранящиеся в, и я не уверен, что приведение к void * не нарушит operator == для объектов, использующих наследование.

Ответы [ 4 ]

6 голосов
/ 03 сентября 2010

Вам повезло с вашей первоначальной идеей использования map<void*, int>.
Хотя вы правы, что operator< не определено для указателей, предикат, используемый std::map<>, равен std::less<>, а стандарт C ++ требует, чтобы std::less<T*> также работал для произвольных указателей.

Цитата из стандарта C ++ для поддержки этого ([lib.comparisons] / 8):

Для шаблонов greater, less, greater_equal и less_equal специализации для любого типа указателя дают общий порядок, даже если встроенные операторы <, >, <=, >= нет.

1 голос
/ 03 сентября 2010

Почему бы вам просто не ввести фиктивный базовый класс для всех ваших сериализуемых классов?

class Serializable
{
};

map< Serializable *, int > integralMap;
0 голосов
/ 03 сентября 2010
0 голосов
/ 03 сентября 2010

Вы можете просто сделать карту без знака int32 / 64 для int (в зависимости от x86 или x64).Просто приведите void * к unsigned int, и он с радостью сделает сравнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...