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śćInTypes. 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?

questionAnswers(3)

yourAnswerToTheQuestion