số Kiểu trả về của một hàm C++ chỉ có thể khác nhau dựa trên các thông số mẫu rõ ràng hoặc loại của đối số của nó. Nó không thể thay đổi dựa trên giá trị của các đối số của nó.
Tuy nhiên, bạn có thể sử dụng các kỹ thuật khác nhau để tạo loại kết hợp một số loại khác. Thật không may điều này sẽ không nhất thiết giúp bạn ở đây, như là một kỹ thuật như vậy là void * chính nó, và nhận được trở lại loại ban đầu sẽ là một nỗi đau.
Tuy nhiên, bằng cách chuyển vấn đề bên trong ra ngoài, bạn có thể nhận được những gì bạn muốn. Tôi tưởng tượng bạn muốn sử dụng mã bạn được đăng như một cái gì đó như thế nào, ví dụ:
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]);
}
Bởi vì C++ cần phải biết loại p_pixels tại thời gian biên dịch, điều này sẽ không làm việc như nó vốn có. Nhưng những gì chúng ta có thể làm là làm cho bitmap_operation bản thân là một mẫu, sau đó quấn nó với một công tắc dựa trên độ sâu:
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!");
}
Bây giờ trình biên dịch sẽ tự động tạo ra ba triển khai cho bitmap_operation_impl cho bạn.
Làm thế nào để bạn hy vọng sẽ sử dụng điều này? Rất có thể thiết kế của bạn không tuân theo các phương pháp OOP tốt nhất. – outis
Adobe Photoshop SDK là những gì tôi đang sử dụng, và họ sử dụng void * – Joel
Bạn có thể đưa ra một ví dụ sử dụng, bao gồm cả một cuộc gọi đến một chức năng SDK của Photoshop? – outis