Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





[C++] Custom key para un map STL

Iniciado por Chema, 28 de Mayo de 2008, 05:49:44 PM

« anterior - próximo »

Chema

Hola a todos,

Estoy teniendo problemas con un trozo de código y empiezo a sospechar de la "custom key" que uso para el map. La clave se compone de un puntero y un enum, el orden es primero segun el puntero, luego segun el enum:

struct PixelShaderSetupId {
IDirect3DPixelShader9* d3d_shader;
D3DCMPFUNC alpha_func;
PixelShaderSetupId() {
d3d_shader = 0;
alpha_func = D3DCMP_ALWAYS;
}
PixelShaderSetupId(IDirect3DPixelShader9* _d3d_shader, D3DCMPFUNC _alpha_func) {
d3d_shader = _d3d_shader;
alpha_func = _alpha_func;
}
bool operator<(const PixelShaderSetupId &b) const {
if((unsigned int)(d3d_shader) < (unsigned int)(b.d3d_shader))
return true;
else if((unsigned int)(d3d_shader) > (unsigned int)(b.d3d_shader))
return false;
else
return (unsigned int)(alpha_func) < (unsigned int)(b.alpha_func);
}
bool operator==(const PixelShaderSetupId &b) const {
return (d3d_shader == b.d3d_shader) && (alpha_func == b.alpha_func);
}
};


¿Veis algo incorrecto? Tengo un juego de pruebas bastante gordo y el código funciona el 99% de las veces, así que el fallo debe ser sutil.

Gracias,

Chema

nostromo

Hola, creo que debes darle al map una función binaria. Como ejemplo:


bool funcionCompara(double x, double y) { return fabs(x) < fabs(y); }


Cambiando double por el tipo de la clave(key) del map. Y el código de comparación claro.

Un saludo

davur

Normalmente no es necesario pasar una función de comparación a std::map, porque este último está declarado como (sección 23.3.1/2 del estándar):


namespace std {

template <class Key, class T, class Compare = less<Key>,
         class Allocator = allocator<pair<const Key, T> > >
class map {...};

} // namespace std


Y std::less devuelve el resultado de aplicar el operador menor-que.

Sin más información, es complicado responder sin recurrir a la mera especulación. Viendo el código me pregunto, por ejemplo, por qué en la implementación del operador menor-que de PixelShaderSetupId comparas enteros sin signo resultado de castings desde punteros a IDirect3DPixelShader9 [1] [2].

[1] Es conveniente notar (únicamente por completitud) que, de acuerdo con 5.2.10/5, "[...] mappings between pointers and integers are otherwise implementation-defined".

[2] Dicho sea de paso, puedes utilizar uno de los typedefs declarados en D3D9.h: LPDIRECT3DPIXELSHADER9 o PDIRECT3DPIXELSHADER9.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.