迭代器到LONG_PTR

时间:2011-01-11 00:10:59

标签: c++ windows winapi

我可以将指向set元素的迭代器转换为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 个答案:

答案 0 :(得分:3)

LONGPTR__int3264

在任何情况下,都不能将迭代器强制转换为此类型,因为迭代器不是指针。但是,您可以获取迭代器指向的元素的地址(使用&*it),假设存储在容器中的对象类型不会使一元&重载(如果它确实超载了一元&,这是一个坏的,糟糕的阶级。)

答案 1 :(得分:0)

可能不会,如果你的意思是std::set。通常,STL迭代器是比指针复杂得多的对象。

LONG_PTR是一个足以容纳长指针或指针的类型。