Нет. Тип возвращаемого значения функции C ++ может изменяться только в зависимости от явных параметров шаблона или types ее аргументов. Он не может варьироваться в зависимости от значения своих аргументов.
Однако вы можете использовать различные методы для создания типа, который является объединением нескольких других типов. К сожалению, это не обязательно поможет вам в этом, поскольку одна из таких техник сама по себе void *, и возвращение к первоначальному типу будет проблемой.
Однако, вывернув проблему наизнанку, вы можете получить то, что хотите. Я полагаю, вы захотите использовать код, который вы разместили, например:
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]);
}
Поскольку C ++ должен знать тип p_pixels во время компиляции, он не будет работать как есть. Но то, что мы можем сделать, это сделать сам bitmap_operation шаблоном, а затем обернуть его переключателем на основе глубины:
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!");
}
Теперь компилятор автоматически сгенерирует три реализации для bitmap_operation_impl для вас.