No. El tipo de retorno de una función C++ sólo pueden variar en función de los parámetros de plantilla explícitas o los tipos de sus argumentos. No puede variar en función del valor de sus argumentos.
Sin embargo, puede usar varias técnicas para crear un tipo que sea la unión de varios otros tipos. Lamentablemente, esto no necesariamente lo ayudará aquí, ya que una de esas técnicas es nula * en sí misma, y volver al tipo original será un dolor.
Sin embargo, al darle la vuelta al problema, puede obtener lo que desea. Me imagino que te gustaría utilizar el código que envió como algo parecido, por ejemplo:
void bitmap_operation(void *data, int depth, int width, int height) {
some_magical_type p_pixels = returnPointer(data, depth);
for (int x = 0; x < width; x++)
for (int y = 0; y < width; y++)
p_pixels[y*width+x] = some_operation(p_pixels[y*width+x]);
}
Debido a que C++ necesita saber el tipo de p_pixels en tiempo de compilación, esto no funcionará como está. Pero lo que podemos hacer es bitmap_operation ser en sí mismo una plantilla, a continuación, se envuelve con un interruptor basado en la profundidad:
template<typename PixelType>
void bitmap_operation_impl(void *data, int width, int height) {
PixelType *p_pixels = (PixelType *)data;
for (int x = 0; x < width; x++)
for (int y = 0; y < width; y++)
p_pixels[y*width+x] = some_operation(p_pixels[y*width+x]);
}
void bitmap_operation(void *data, int depth, int width, int height) {
if (depth == 8)
bitmap_operation_impl<uint8_t>(data, width, height);
else if (depth == 16)
bitmap_operation_impl<uint16_t>(data, width, height);
else if (depth == 32)
bitmap_operation_impl<uint32_t>(data, width, height);
else assert(!"Impossible depth!");
}
Ahora el compilador generará automáticamente tres implementaciones para bitmap_operation_impl para usted.
¿Cómo espera a usar esto? Es probable que su diseño no siga las mejores prácticas de OOP. – outis
Adobe Photoshop SDK es lo que estoy usando, y usan void * – Joel
¿Podría dar un ejemplo de uso, incluyendo una llamada a una función de Photoshop SDK? – outis