На предыдущем работодателе мы писали бинарные сообщения, которые приходилось "прокладывать" на другие компьютеры. Каждое сообщение имело стандартный заголовок:
class Header
{
int type;
int payloadLength;
};
Все данные были смежными (заголовок, сразу за которым следует данные). Мы хотели получить полезную нагрузку, учитывая, что у нас был указатель на заголовок. Традиционно вы можете сказать что-то вроде:
char* Header::GetPayload()
{
return ((char*) &payloadLength) + sizeof(payloadLength);
}
или даже:
char* Header::GetPayload()
{
return ((char*) this) + sizeof(Header);
}
Это казалось довольно многословным, поэтому я придумал:
char* Header::GetPayload()
{
return (char*) &this[1];
}
Вначале кажется довольно тревожным, возможно, слишком странным - но очень компактным. Было много дебатов о том, было ли это блестящим или мерзостью.
Итак, что это - преступление против кодирования, или хорошее решение? У вас когда-либо был подобный компромисс?
-Обновление:
Мы попробовали массив нулевого размера, но в то время компиляторы выдавали предупреждения. В конце концов мы перешли к унаследованному методу: Сообщение происходит от заголовка. Он отлично работает на практике, но в принципе вы говорите сообщение IsA Header - что кажется немного неудобным.