2009-08-16 6 views
3

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

template <typename type> union lrbPointer 
{ 
    uint64_t intForm; 
    type ptrForm; //assumed that type is a pointer type 
}; 

//usage 
lrbPointer<int*> myPointer; 
int integers[4]; 
myPointer.ptrForm = integers; 
myPointer.intForm += 2; //making it easy to jump by less then sizeof(int) 

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

+6

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

+0

Я прошу приемную машину для адреса памяти, где он запустит блок данных, с этой информацией я могу вычислить указатели на принимающем компьютере. он, конечно, делает все нечитаемым на отправляющей машине, но моя цель - сделать больше работы на отправляющей машине из-за очень разных процессоров и сред на обеих машинах. В настоящий момент эта проблема является лишь проблемой запутывания выглядящего кода для пользователя, у меня есть функциональность. – Adam

ответ

6

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

template <typename PtrType> 
union IntPointer 
{ 
    uint64_t intForm; 
    PtrType ptrForm; 

    IntPointer(PtrType ptr) : 
    ptrForm(ptr) 
    { 
    } 

    operator PtrType(void) const 
    { 
     return ptrForm; 
    } 
}; 

int main(void) 
{ 
    IntPointer<float*> f = new float; // constructor 

    float *theFloat = f; // conversion operator 

    delete theFloat; 
} 

То есть, я думаю, что ваш ступая по тонкому земле. : |

+0

Отказ от ответственности: Я пробовал это без компилятора, дайте мне знать, если что-то противоречит стандарту. – GManNickG

+0

+1 Человек, я не знал, что у вас может быть оператор преобразования в союзе :) – AraK

+0

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

Смежные вопросы