c ++: buen nombre para las clases de conversión de argumentos de argumentos

En C ++, a veces termino con clases de utilidad como esta:

struct time_ref
{
   time_ref(FILETIME & ft) : ftval(&ft), ttval(0) {}
   time_ref(time_t & tt) : ttval(&tt), ftval(0) {}

   FILETIME * ftval; 
   time_t   * ttval;
}

Se basan en conversiones implícitas, por ejemplo, para reducir el número de sobrecargas:

void Foo(int x, int y, time_ref t)

Justificación: si Foo tiene otro parámetro con sobrecargas, los prototipos se multiplican, por ejemplo, 3 sobrecargas para X * 2 sobrecargas para t son 6 prototipos, en comparación con 3 con el convertidor anterior (o incluso uno si se utilizan dos convertidores).


Ellos siempre:

  • tienen constructores implícitos para dos o más tipos
  • debe usarse solo como parámetros de función para habilitar estas conversiones

Se diferencian en:

  • Número de tipos admitidos
  • puede almacenar un valor o una referencia
  • cómo el destinatario de la llamada detecta qué tipo se proporcionó (en el caso anterior, es el puntero no nulo. Otra implementación típica es un campo de enumeración y una unión de valores de datos)

Preguntas:

1. ¿Existe un nombre común / aceptado para este patrón? Normalmente los llamo "convertidor de argumentos" o "adaptador de argumentos", lo que no parece común

2. recomendaciones para formalizarlas - por ejemplo, ¿hay alguna forma (además de agregar un comentario que lo diga) para garantizar que se utilicen solo como parámetros? ¿Alguna otra cosa a tener en cuenta?

preguntado el 08 de enero de 11 a las 21:01

Supongo que la lógica para tratar con cada argumento es algo separada, por lo que en realidad no necesita (recuento de tipos de arg 1) * (recuento de tipos de arg 2) * (recuento de tipos de arg 3) implementaciones diferentes. En ese caso, probablemente podría usar plantillas para volver a (recuento de tipos arg 1) + (recuento de tipos arg 2) + (recuento de tipos arg 3) sobrecargas. -

@sbi: eso es lo que normalmente uso cuando hay dos tipos, tengo un caso de uso con 5;) - Me preguntaba si el patrón tiene un nombre común -

@peterchen: Pero todos esos cinco tipos deben tener algo en común, o no los pondría juntos, ¿verdad? ¿Por qué no nombrar la estructura después de eso? En el caso anterior, time parece ser un nombre tan bueno como podría serlo. (No creo que haya un patrón para lo que estás haciendo, e incluso si hubiera uno descrito en alguna parte, las respuestas muestran que sería demasiado desconocido para ayudar a los que vienen después de ti).

El nombre de la estructura es time_ref - porque contiene una referencia a un tiempo (detalles aquí: codeproject.com/KB/library/timeconvert2.aspx) ---- sí, parece que no tiene un nombre común. Seguiré indeciso entre "adaptador de argumento" y "cobertura de parámetro". ;) -

3 Respuestas

Una corrección es a menudo una buena opción cuando necesita manejar muchos tipos de argumentos diferentes, incluso después de que su interfaz está "lista". Le permite realizar la conversión de una manera modular y bastante reutilizable. Ver esta entrada de wikipedia y sus artículos de referencia para obtener más información.

Respondido el 09 de enero de 11 a las 01:01

Parece que no hay un nombre común para el patrón. Acepté esta respuesta porque proporciona una implementación alternativa (incluso con un nombre): Peterchen

  1. Como probablemente sepa, en C ++ "aceptado / común" depende de la plataforma en la que se esté ejecutando. Un programa Unix C ++ difiere en convenciones de un programa WIN32 C ++, por ejemplo. Dicho esto, no he visto este tipo de clases muy a menudo, por razones obvias: incurren en una sobrecarga de rendimiento. Está creando un nuevo objeto en cada llamada a la función, lo cual es bastante innecesario. Sin embargo, le ahorra algo de código, por lo que puede valer la pena en casos específicos, pero aún así debe considerarse cuidadosamente.

  2. Hasta donde yo sé, no hay forma en C ++ de restringir que una clase t se use solo como un parámetro. Al menos, no se pueden crear instancias sin recibir uno de los tipos admitidos en sus constructores. Una cosa en la que estoy pensando es que probablemente debería admitir una copia de ctor para permitir pasar la clase del convertidor entre llamadas (si tiene dos conjuntos de funciones separados como describió, y uno llama al otro).

Respondido el 09 de enero de 11 a las 00:01

Gracias. Considero que esto no es específico de la plataforma (en el sentido de Win32 frente a Unix): los tipos son, el patrón es portátil en C ++. - Peterchen

Sí, definitivamente, el patrón en sí funcionará. Me refería a las convenciones de nomenclatura. - Eldad Mor

¿Qué pasa con las sobrecargas? Es perfectamente seguro definir Foo (X) que se implementa usando Foo (Bar (X)). Creo que está más claro que la elaboración de clases de envoltura.

Respondido el 09 de enero de 11 a las 01:01

Vea el fundamento: imagine un método que toma tres ID de recursos de Win32 que pueden ser entradas o cadenas: sin adaptador, son 8 sobrecargas allí mismo. Si agrega una tercera forma de identificar un recurso, tiene 3 sobrecargas. Foo(MAKEINTRESOURCE(IDR_TB1), MAKEINTRESOURCE(IDR_MENU1), _T("quickhelp_1")) ¿OMI no es más claro que Foo(IDR_TB1, IDR_MENU1, _T("quickhelp_1")). - Peterchen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.