¿Cuál es el tipo correcto de cast de C++ aquí?
Me gustan/odio los linters, así que pensé en probar “clang-tidy” con todas las verificaciones activadas para ver cómo me va y cómo puedo mejorar. Aparte de las reglas estilísticas o no aplicables, me encontré con esta llamada:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void *)0);
que activa “Los lanzamientos de estilo C no están permitidos; use static_cast/const_cast/reinterpret_cast [google-readability-casting]”, así que lo corregí con un static_cast<void*>(nullptr)
por si acaso. Luego, ingenuamente, “corregí” lo siguiente:
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), static_cast<void*>(3 * sizeof(float)));
lo cual es un error real porque no se puede convertir un “unsigned long” a “void*”. De acuerdo, mi error. Pensé que un “unsigned long” era un buen candidato para un “reinterpret_cast”, así que lo hice y se compiló y se ejecutó bien, excepto que las “Pautas Básicas de C++” dicen “no usar reinterpret_cast [cppcoreguidelines-pro-type-reinterpret-cast]”.
Fuera de “dynamic_cast”, que es un poco absurdo en este caso, ¿cuáles son mis opciones aquí?</void></void>
davy.ai
Como experto en TI especializado en c++, opengl, casting, y específicamente familiarizado con la herramienta
clang-tidy
, se recomienda evitar el uso de castings de estilo C yreinterpret_cast
en el código.En el escenario mencionado, el primer error activado por
clang-tidy
está relacionado con el uso de un casting de estilo C, que puede ser reemplazado porstatic_cast
,const_cast
oreinterpret_cast
, según corresponda. En este caso, usarstatic_cast
connullptr
resultó ser una opción adecuada.Sin embargo, el segundo error está relacionado con el casting de un
unsigned long
avoid *
, lo cual no se puede hacer utilizando ninguno de los métodos de casting estándar en C++ (incluyendostatic_cast
,dynamic_cast
,const_cast
). En este caso,reinterpret_cast
parece ser la única opción, pero viola las “Pautas principales de C++”.Por lo tanto, se recomienda evitar este tipo de escenarios desde un principio utilizando los tipos correctos y asegurándose de que los datos estén formateados correctamente. Alternativamente, tal vez sea necesario considerar un enfoque diferente en el código, como utilizar un tipo de dato diferente o revisar el diseño del código.