Czy mogę użyć częściowej specjalizacji szablonów dla funkcji (nie będących członkami)?
Próbuję użyć częściowej specjalizacji szablonów dla funkcji (nie będących członkami) i włączam składnię. Przeszukałem StackOverflow dla innych pytań dotyczących specjalizacji szablonów częściowych, ale dotyczą one częściowej specjalizacji szablonu funkcji klasy lub elementu.
Na początek mam:
struct RGBA {
RGBA(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) :
r(red), g(green), b(blue), a(alpha)
{}
uint8 r, g, b, a;
};
struct Grayscale {
Grayscale(uint8 intensity) : value(intensity) {}
uint8 value;
};
inline uint8 IntensityFromRGB(uint8 r, uint8 g, uint8 b) {
return static_cast<uint8>(0.30*r + 0.59*g + 0.11*b);
}
// Generic pixel conversion. Must specialize this template for specific
// conversions.
template <typename InType, typename OutType>
OutType ConvertPixel(InType source);
Mogę wykonać pełną specjalizację ConvertPixel, aby funkcja konwersji RGBA do skali szarości wyglądała tak:
template <>
Grayscale ConvertPixel<RGBA, Grayscale>(RGBA source) {
return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}
Mogę mieć więcej typów pikseli, które oferują czerwony, zielony i niebieski, ale być może w innym formacie, więc to, co naprawdę chciałbym zrobić, to częściowa specjalizacja przez określenieGrayscale
dlaOutType
i nadal pozwalają na różnorodnośćInType
s. Próbowałem różnych metod, takich jak:
template <typename InType>
Grayscale ConvertPixel<InType, Grayscale>(InType source) {
return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}
Ale kompilator (Microsoft VS 2008 C ++) go odrzuca.
Czy to, co próbuję, jest możliwe? Jeśli tak, jaka jest właściwa składnia?