В настоящее время я пишу библиотеку для редактирования памяти C ++, а для API чтения / записи я использую черты типа (std :: is_pod, std :: is_same) и boost :: enable_if для обеспечения 3 перегрузок:
- Типы POD.например, MyMem.Read (SomeAddress);
- Типы строк.например, MyMem.Read> (SomeAddress);(Это на самом деле не считывает строку C ++, она считывает строку в стиле C и преобразует ее в строку C ++.)
- Векторные типы.например, MyMem.Read> (SomeAddress, NumElem);(На самом деле это не считывает вектор, скорее он считывает массив в стиле C и преобразует его в вектор.)
Перегрузки 2 и 3 являются просто «обертками» вокруг перегрузки 1.(Так что, если вы читаете std :: vector или std :: basic_string, а T не является POD, он потерпит неудачу, как и должно быть.)
Недавно я хотел использовать std :: array для множествачитает и пишет, потому что я знал размер данных, которые я хотел прочитать и записать во время компиляции (я писал оболочку для формата PE).
Я написал код для использования std :: array,и затем намеревался добавить еще одну перегрузку для обнаружения и обработки типов std :: array, но я случайно нажал на compile и, к моему удивлению, это сработало!
В настоящее время я использую MSVC 10, и оказалось, что для std:: массив, если T - POD, тогда std :: array - это POD.(Это означает, что я могу просто использовать перегрузку 1, и она работает.)
Мой вопрос заключается в том, гарантируется ли это стандартом C ++ или оставлено на усмотрение реализации.
Я знаю, что могу проверитьЯ сам по себе стандарт, но я не доверяю себе настолько, насколько доверяю некоторым языковым адвокатам на этом сайте, поэтому я подумал, что было бы лучше получить «второе мнение».;)
Спасибо
PS Код доступен здесь (это библиотека только для заголовков): http://code.google.com/p/hadesmem/source/browse/trunk/HadesMem-v2/Hades-Memory/Hades-Memory/MemoryMgr.h#86