Итератор для LONG_PTR - PullRequest
       1

Итератор для LONG_PTR

0 голосов
/ 11 января 2011

смогу ли я привести итератор, который указывает на элемент набора к LONG_PTR?

PS: я не до конца понимаю, что такое LONG_PTR?

Вот пример кодакоторый выдает ошибку во время выполнения

#include <windows.h>
#include <set>
#include <string>
using namespace std;

void func(LPARAM lp)
{
    set<string>::iterator *it = reinterpret_cast<set<string>::iterator*>(lp);

    string s = *(*it); //runtime-error
}

int main()
{
    char *arr[] = {"0", "1", "2", "3", "4", "5"};

    set<string> s(arr, arr+5);
    set<string>::iterator it = s.begin()++;

    LONG_PTR lp = reinterpret_cast<LONG_PTR>(&*it);

    func(lp);
}

Ответы [ 2 ]

3 голосов
/ 11 января 2011

A LONGPTR является __int3264.

В любом случае вы не можете привести итератор к этому типу, потому что итератор не является указателем. Однако вы можете взять адрес элемента, на который указывает итератор (используя &*it), предполагая, что тип объекта, хранящийся в контейнере, не перегружает унарный & (если он перегружает унарный & Плохой, плохой класс).

0 голосов
/ 11 января 2011

Вероятно, нет, если вы имеете в виду std::set под множеством. Как правило, итераторы STL являются объектами, намного более сложными, чем указатель.

LONG_PTR - это тип, достаточно большой для размещения либо long, либо указателя.

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