Quand t'es habitué t'en fais abstraction. C'est un peu particulier ici car techniquement ma lambda est générique (Ce bout de code en particulier me permet de lier une valeur à une description, et à un type. ça m'évite de a) faire un enum et b) faire un switch sur les valeurs avec les chaines, tout est fait d'un coup par le compilo. Cette construction en particulier est utilisée pour construire des exceptions, qui sont renvoyées à un client java à travers les named pipes que j'ai mentionné plus haut, et en gros, mon code final devient:
throw Exception(ErrorCode::WindowAcquisitionFailed { })
Moins de répétition, typage fort, et en plus de ça, la quasi totalité du code disparaît.
describeCode(unsigned int): # @describeCode(unsigned int)
push rbx
cmp edi, 1396834305
je .LBB0_1
cmp edi, 1396834306
jne .LBB0_3
mov rbx, qword ptr [rip + template parameter object for StringLiteral<44ul>{char [44]{(char)69, (char)114, (char)114, (char)101, (char)117, (char)114, (char)32, (char)108, (char)111, (char)114, (char)115, (char)32, (char)100, (char)101, (char)32, (char)108, (char)97, (char)32, (char)99, (char)114, (char)-61, (char)-87, (char)97, (char)116, (char)105, (char)111, (char)110, (char)32, (char)100, (char)117, (char)32, (char)99, (char)111, (char)110, (char)116, (char)114, (char)-61, (char)-76, (char)108, (char)101, (char)32, (char)84, (char)88}}@GOTPCREL]
jmp .LBB0_5
.LBB0_1:
mov rbx, qword ptr [rip + template parameter object for StringLiteral<43ul>{char [43]{(char)69, (char)114, (char)114, (char)101, (char)117, (char)114, (char)32, (char)108, (char)111, (char)114, (char)115, (char)32, (char)100, (char)101, (char)32, (char)108, (char)97, (char)32, (char)99, (char)114, (char)-61, (char)-87, (char)97, (char)116, (char)105, (char)111, (char)110, (char)32, (char)100, (char)101, (char)32, (char)108, (char)97, (char)32, (char)102, (char)101, (char)110, (char)-61, (char)-86, (char)116, (char)114, (char)101}}@GOTPCREL]
.LBB0_5:
mov rdi, rbx
call strlen
mov rdx, rbx
pop rbx
ret
.LBB0_3:
mov ebx, offset .L.str
mov eax, 21
mov rdx, rbx
pop rbx
ret
template parameter object for StringLiteral<43ul>{char [43]{(char)69, (char)114, (char)114, (char)101, (char)117, (char)114, (char)32, (char)108, (char)111, (char)114, (char)115, (char)32, (char)100, (char)101, (char)32, (char)108, (char)97, (char)32, (char)99, (char)114, (char)-61, (char)-87, (char)97, (char)116, (char)105, (char)111, (char)110, (char)32, (char)100, (char)101, (char)32, (char)108, (char)97, (char)32, (char)102, (char)101, (char)110, (char)-61, (char)-86, (char)116, (char)114, (char)101}}:
.asciz "Erreur lors de la cr\303\251ation de la fen\303\252tre"
.L.str:
.asciz "Code d'erreur inconnu"
template parameter object for StringLiteral<44ul>{char [44]{(char)69, (char)114, (char)114, (char)101, (char)117, (char)114, (char)32, (char)108, (char)111, (char)114, (char)115, (char)32, (char)100, (char)101, (char)32, (char)108, (char)97, (char)32, (char)99, (char)114, (char)-61, (char)-87, (char)97, (char)116, (char)105, (char)111, (char)110, (char)32, (char)100, (char)117, (char)32, (char)99, (char)111, (char)110, (char)116, (char)114, (char)-61, (char)-76, (char)108, (char)101, (char)32, (char)84, (char)88}}:
.asciz "Erreur lors de la cr\303\251ation du contr\303\264le TX"
Le typage est un peu infect parce que j'utilise une nouveauté du C++20 qui me permet d'avoir des chaînes de caractères dans les template (ça se convertit implicitement en template en explosant les caractères un par un), mais tu vois que j'ai bien l'équivalent de deux
if (code == x) dans l'assembleur. (l'appel de strlen me perturbe, la longueur de la chaîne est sensée être connue, comme c'est le cas dans l'autre cas)