Я пытаюсь использовать частичную специализацию шаблона для функции (не являющейся членом), и я использую синтаксис. Я искал в 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
по-прежнему учитывают различные InType
с. Я пробовал различные подходы, как это:
template <typename InType>
Grayscale ConvertPixel<InType, Grayscale>(InType source) {
return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}
Но компилятор (Microsoft VS 2008 C ++) отклоняет его.
Возможно ли то, что я пытаюсь сделать? Если да, то какой синтаксис правильный?