Kann ich eine teilweise Template-Spezialisierung für eine (Nicht-Mitglieder-) Funktion verwenden?

Ich versuche, eine teilweise Template-Spezialisierung für eine (Nicht-Member-) Funktion zu verwenden, und ich stolpere über die Syntax. Ich habe in StackOverflow nach anderen Fragen zur Teilspezialisierung von Vorlagen gesucht, die sich jedoch mit der Teilspezialisierung einer Klassen- oder Elementfunktionsvorlage befassen.

Als Ausgangspunkt habe ich:

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);

Ich kann eine vollständige Spezialisierung von ConvertPixel durchführen, um eine Konvertierungsfunktion von RGBA in Graustufen wie folgt durchzuführen:

template <>
Grayscale ConvertPixel<RGBA, Grayscale>(RGBA source) {
    return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}

Es ist denkbar, dass es mehr Pixeltypen gibt, die Rot, Grün und Blau anbieten, aber möglicherweise in einem anderen Format. Ich würde also gerne eine teilweise Spezialisierung durch Spezifizieren vornehmenGrayscale zumOutType und noch für eine Vielzahl vonInTypes. Ich habe verschiedene Ansätze wie diesen ausprobiert:

template <typename InType>
Grayscale ConvertPixel<InType, Grayscale>(InType source) {
    return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}

Der Compiler (Microsoft VS 2008 C ++) lehnt dies jedoch ab.

Ist das, was ich versuche, möglich? Wenn ja, wie lautet die richtige Syntax?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage