Я пытаюсь использовать частичную специализацию шаблона для функции (не являющейся членом), и я могу отключиться от синтаксиса. Я искал 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++) отклоняет его.
Является ли то, что я пытаюсь сделать возможным? Если да, то какой правильный синтаксис?
вы не можете. Использовать перегрузку – KeatsPeeks