Могу ли я использовать частичную специализацию шаблона для функции (не являющейся членом)?

Я пытаюсь использовать частичную специализацию шаблона для функции (не являющейся членом), и я использую синтаксис. Я искал в StackOverflow другие вопросы о частичной специализации шаблонов, но они касаются частичной специализации шаблона класса или функции-члена.

Для начала у меня есть:

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

Я могу сделать полную специализацию ConvertPixel, чтобы сделать функцию преобразования RGBA в оттенки серого следующим образом:

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

Возможно, у меня будет больше типов пикселей, которые предлагают красный, зеленый и синий, но, возможно, в другом формате, так что я бы хотел сделать частичную специализацию, указавGrayscale заOutType и до сих пор учитывают различныеInTypes. Я пробовал различные подходы, как это:

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

Но компилятор (Microsoft VS 2008 C ++) отклоняет его.

Возможно ли то, что я пытаюсь сделать? Если так, какой правильный синтаксис?

Ответы на вопрос(3)

Ваш ответ на вопрос