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