我正在尝试在(非成员)函数上使用部分模板专业化,并且我在语法上绊倒了。我在 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
forOutType
并仍然允许各种InType
s 来进行部分专业化。我尝试了各种这样的方法:
template <typename InType>
Grayscale ConvertPixel<InType, Grayscale>(InType source) {
return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}
但是(Microsoft VS 2008 C++)编译器拒绝它。
我正在尝试的可能吗?如果是这样,正确的语法是什么?