- 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);
}
LispGovno 18.01.2013 20:58 # −1
tirinox 18.01.2013 23:55 # +5
И говно найду... Например, почему main ничего не возвращает?!
inkanus-gray 19.01.2013 00:54 # +4
1. "\n" вместо endl выглядит просто ужасно.
2. (void)msg; похоже на говно. Я понимаю, что это для того, чтобы компилятор не ругался на неиспользуемый параметр. Но это же костыль!
3. Не указан тип параметров main.
Dummy00001 19.01.2013 02:28 # +2
endl форсирует flush - "\n" нет. мы тут типа производительность оптимизируем для случая если программа выводит на тормозной терминал :)
> 3. Не указан тип параметров main.
есть 3(?) валидных прототипа main предусмотреных стандартом:
bormand 19.01.2013 08:59 # +2
guest 19.01.2013 10:23 # 0
bormand 19.01.2013 12:33 # 0
guest 19.01.2013 14:28 # 0
roman-kashitsyn 19.01.2013 10:58 # +2
bormand 19.01.2013 12:31 # +1
void ReadMsg(int /*msg*/) тоже. А из двух говн выбирают по вкусу.
P.S. void ReadMsg(int) еще большее говно, т.к. тут теряется имя переменной, и если оно понадобится - его нужно будет искать в доке\предке. К тому же так нельзя в Си.
Dummy00001 19.01.2013 02:25 # +2
это прикол который меня в свое время заставил долго гуглить. фишка: в оригинальном С, если в main отсутствовал в конце return, то возвращался автоматом ноль. (то же самое если main был объявлен void.) если правильно помню, в стандартизированом С (в ANSI C/C89) main должен был чего-то возвращать. другими словами: main перестал быть специальным, и стал просто функцией.
inkanus-gray 19.01.2013 03:02 # 0
inkanus-gray 19.01.2013 03:20 # 0
Dummy00001 19.01.2013 03:27 # +3
мне в свое время пришлось перепахать кучи пре-ANSI C кода. фишка с main была как раз тем местом которое сломалось на новых компиляторах (даже на том который клялся что поддерживает pre-ANSI 100% (хотя как можно поддерживать 100% нечто нестандартизированое?)). это было очень очевидно, потому что тест-кэйсы рандомно обламывались. и обламывались они потому что ни в одном main'е не стояло return'а. поэтому то мне и пришлось тогда это дело гуглить и ковырять и фиксить.
bormand 19.01.2013 09:02 # +1
А вот если в гцц врубить совместимость с с89 и не написать ретурн, то он действительноиначинает возвращать всякую херню.
P.s. лучше бы они ошибку компиляци выдавали, чем херню или ноль возвращать... исправить ее было бы намного проще, чем думать о том почему мусор в коде возврата.
guest 19.01.2013 10:21 # +1
Ну и в режиме с89 никто в здравом уме компилировать не будет, а только если встретит с89 программу, поэтому ошибку кидать нельзя, а то пол генту несоберется при сборке пакаджей.
guest 19.01.2013 10:25 # 0
bormand 19.01.2013 12:35 # 0
guest 19.01.2013 14:19 # +1
> Ну там не rand()
http://feross.org/gcc-ownage/
guest 19.01.2013 14:32 # −1
Теперь ты анон знаешь как в пару строчек на крестах написать игру. Такой лаконичности нет даже в хаскеле.
bormand 19.01.2013 12:40 # +1
Ломаешь совместимость - так ломай ее полностью явно. Имхо ошибка при компиляции намного лучше, чем неведомая хуита в рантайме.
Dummy00001: это прикол который меня в свое время заставил долго гуглить.
А вот если была бы выдана корректная ошибка - ему пришлось бы гуглить и тратить время.
guest 19.01.2013 10:30 # −3
> Назло поплюсую.
> И говно найду...
Свинья везде говна найдет.
Dummy00001 19.01.2013 02:32 # +2
Xom94ok 19.01.2013 12:36 # 0
bormand 19.01.2013 12:46 # 0
Да ёбаное крестоблядство! Даже мой любимый способ игнорирования ненужных аргументов забаговали ;( Злые вы все, уйду я от вас к жабе или шарпику.
defecate-plusplus 19.01.2013 13:18 # +1
bormand 19.01.2013 13:35 # 0
Я никогда не буду редактировать уже запощенные на ГК коды.
Я никогда не буду редактировать уже запощенные на ГК коды.
Я никогда не буду редактировать уже запощенные на ГК коды.
UPD: Вернул (void)t на место.
guest 19.01.2013 14:37 # −1
guest 19.01.2013 14:33 # +1
И что по твоему она должна делать?
tirinox 19.01.2013 14:50 # +2
Xom94ok 19.01.2013 15:07 # 0
cp7 25.08.2021 02:48 # 0