- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
#include <iostream>
struct Reader_msg;
template<class T>struct TMsg;
struct IMsg
{
virtual ~IMsg(){}
virtual void SendCast(Reader_msg& obj) = 0;
};
struct Some{};
struct Reader_msg
{
template<class T> void ReadMsg(T& msg)
{
//Здесь можно приляпать статик_ассерт
std::cout<<"ERROR UNKNOW TYPE \n";
}
void ReadMsg(int msg) { (void)msg; std::cout<<"TYPE IS INT\n"; }
void ReadMsg(float msg) { (void)msg; std::cout<<"TYPE IS FLOAT\n"; }
void ReadMsg(Some msg) { (void)msg; std::cout<<"TYPE IS SOME\n"; }
template<class T>void TakeMsg(T& msg) { msg.SendCast(*this); }
};
template<class T>struct TMsg:IMsg
{
T data;
void SendCast(Reader_msg& obj){ obj.ReadMsg(data); }
};
int main()
{
Reader_msg reader;
TMsg<int> msg1;
TMsg<float> msg2;
IMsg& msg3 = msg1;
IMsg& msg4 = msg2;
TMsg<Some> msg5;
TMsg<double> msg6;
reader.TakeMsg(msg1);
reader.TakeMsg(msg2);
reader.TakeMsg(msg3);
reader.TakeMsg(msg4);
reader.TakeMsg(msg5);
reader.TakeMsg(msg6);
}
И говно найду... Например, почему main ничего не возвращает?!
1. "\n" вместо endl выглядит просто ужасно.
2. (void)msg; похоже на говно. Я понимаю, что это для того, чтобы компилятор не ругался на неиспользуемый параметр. Но это же костыль!
3. Не указан тип параметров main.
endl форсирует flush - "\n" нет. мы тут типа производительность оптимизируем для случая если программа выводит на тормозной терминал :)
> 3. Не указан тип параметров main.
есть 3(?) валидных прототипа main предусмотреных стандартом:
void ReadMsg(int /*msg*/) тоже. А из двух говн выбирают по вкусу.
P.S. void ReadMsg(int) еще большее говно, т.к. тут теряется имя переменной, и если оно понадобится - его нужно будет искать в доке\предке. К тому же так нельзя в Си.
это прикол который меня в свое время заставил долго гуглить. фишка: в оригинальном С, если в main отсутствовал в конце return, то возвращался автоматом ноль. (то же самое если main был объявлен void.) если правильно помню, в стандартизированом С (в ANSI C/C89) main должен был чего-то возвращать. другими словами: main перестал быть специальным, и стал просто функцией.
мне в свое время пришлось перепахать кучи пре-ANSI C кода. фишка с main была как раз тем местом которое сломалось на новых компиляторах (даже на том который клялся что поддерживает pre-ANSI 100% (хотя как можно поддерживать 100% нечто нестандартизированое?)). это было очень очевидно, потому что тест-кэйсы рандомно обламывались. и обламывались они потому что ни в одном main'е не стояло return'а. поэтому то мне и пришлось тогда это дело гуглить и ковырять и фиксить.
А вот если в гцц врубить совместимость с с89 и не написать ретурн, то он действительноиначинает возвращать всякую херню.
P.s. лучше бы они ошибку компиляци выдавали, чем херню или ноль возвращать... исправить ее было бы намного проще, чем думать о том почему мусор в коде возврата.
Ну и в режиме с89 никто в здравом уме компилировать не будет, а только если встретит с89 программу, поэтому ошибку кидать нельзя, а то пол генту несоберется при сборке пакаджей.
> Ну там не rand()
http://feross.org/gcc-ownage/
Теперь ты анон знаешь как в пару строчек на крестах написать игру. Такой лаконичности нет даже в хаскеле.
Ломаешь совместимость - так ломай ее полностью явно. Имхо ошибка при компиляции намного лучше, чем неведомая хуита в рантайме.
Dummy00001: это прикол который меня в свое время заставил долго гуглить.
А вот если была бы выдана корректная ошибка - ему пришлось бы гуглить и тратить время.
> Назло поплюсую.
> И говно найду...
Свинья везде говна найдет.
Да ёбаное крестоблядство! Даже мой любимый способ игнорирования ненужных аргументов забаговали ;( Злые вы все, уйду я от вас к жабе или шарпику.
Я никогда не буду редактировать уже запощенные на ГК коды.
Я никогда не буду редактировать уже запощенные на ГК коды.
Я никогда не буду редактировать уже запощенные на ГК коды.
UPD: Вернул (void)t на место.
И что по твоему она должна делать?