Logo

¡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.
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.