我有一個容器類,在各種格式的像素上運行。有些格式只是將像素存儲在內存中,因此容器的參考類型是像素&。其他格式將像素存儲在打包字節中。沒有什麼可以返回引用,所以在這種情況下引用類型是代理類型。我所有的代理類型都有一個名爲value_type的嵌入式typedef,它是基礎像素的類型。在這種情況下,有什麼方法可以提高模板參數推導嗎?
我在嘗試編寫對像素進行操作的函子時遇到了問題。舉例來說,我希望能夠寫類似:
std::for_each(container.begin(), container.end(), Incrementer());
我已經能夠得到這個工作兩種不同的方式,但我不喜歡任何一方的,所以我很想知道這是否可以改善。
第一種方法是:
struct Incrementer {
template <typename Pixel>
void operator()(Pixel& p) {
p = p + 1;
}
template <typename Proxy>
void operator()(Proxy p, typename Proxy::value_type* dummy=0) {
p = p + 1;
}
};
的基本想法是,我有兩個重載,一個是其中容器返回引用像素的情況下,一個地方返回代理。我需要第二個重載的虛擬參數,以便參考案例是明確的。問題在於我使用的每個仿函數都需要這兩個重載(包括啞參),所以我認爲這個接口相當難看。
也許我可以編寫一些模板魔法來清理參數類型,但我一直遇到編譯器永遠不會推斷引用參數的問題,所以我需要提供一個非常量引用的重載。另一方面,代理是臨時的,所以它不能被非const引用傳遞。這讓我陷入了兩次重載。
有什麼我失蹤了嗎?
回退的解決辦法是這樣的:
template < typename PixelReference >
struct Incrementer {
void operator()(PixelReference p) {
p = p + 1;
}
};
std::for_each(container.begin(), container.end(),
Incrementer< pixel_traits<Pixel,Format>::reference >());
(假設我有一個像素的traits類)。現在我必須在創建仿函數時指定引用類型,這通常很麻煩。
有沒有什麼方法可以改進這些替代方案?我正在編寫這個容器作爲一個庫,所以我試圖儘可能簡單地編寫和使用函子。
謝謝。
我絕對可以做到這一點。爲迭代器分配代理可以正常工作,所以我認爲這是一個很好的技術解決方案。我唯一的擔心是我正在將容器編寫成一個庫,並且我認爲用戶希望for_each能夠工作,而不必向後彎曲太遠而無法容納代理。謝謝。 – user1806566