Мне нужно пропустить указатель через язык сценариев, который имеет только двойной и строковый тип, для этого мне нужно беспокоиться только о 32-битных указателях.
Учитывая, что указатели являются 32-разрядными, я полагал, что double имеет достаточную точность для безопасного хранения указателя, что работает, однако возникает проблема с некоторыми указателями для потоковой передачи, предположительно из-за множественного наследования ... и я действительно не уверен, как ее решить.
В основном я приводил указатели к unsigned
, а затем к double
. Затем, чтобы вернуть их, я приведу double
к unsigned
, а затем к любому типу указателя.
например:.
double example()
{
int *i = new int[100];
return (double)(unsigned)i;
}
double example2(double i)
{
doSomething((int*)(unsigned)i);
}
Однако с типами потоков это, похоже, не работает ...
std::ofstream *fs = new std::ofstream("example.txt");
std::cout << fs << std::endl;//029D1DF8 for example
double d = (double)(unsigned)fs;
std::ios *p = (std::ios*)(unsigned)d;
std::cout << p << std::endl;//029D1DF8 same thing seems fine
std::cout << ((std::ios*)fs) << std::endl;//029D1E54, opps, apparently a cast to std::ios changes the pointer to some offset!
Есть ли способ обойти это? У меня есть идея, используя карту и идентификационные номера, но я бы предпочел избежать стоимости таких карт, которые могут содержать тысячи записей. Я бы предпочел, чтобы кастинг работал на это ...