【发布时间】:2015-07-21 10:44:45
【问题描述】:
我有一些代码使用两种不同类型的颜色,每通道 8 位和每通道 16 位,每种颜色都由一个结构表示。为了有效地重用我的代码,我有一个模板函数可以对它们进行一些渲染。因此,我想要一个模板函数来获取我的颜色通道的最大值。
我最初的尝试是这样的。我只展示了 8 bpc 的专业化
struct Pixel8
{
unsigned char r;
unsigned char g;
unsigned char b;
};
#define PIXEL8_MAX 255
template <class PIXEL>
auto getMax( ) -> decltype( PIXEL::r )
{
static_assert( sizeof(PIXEL) > 0, "getMax can only be called with a pixel type." );
}
template <>
auto getMax<Pixel8>( ) -> decltype( Pixel8::r )
{
return PIXEL8_MAX;
}
这不能用 Visual Studio 2012 编译。我收到错误
1> 错误 C2785: ''unknown-type' getMax(void)' 和 'char getMax(void)' 有不同的返回类型 1> 查看'getMax'的声明
对我来说,我觉得这应该可行,但我找不到任何示例。 Specialize function template with decltype trailing return type 上还有一个类似的问题,但这里每个专业化的返回类型都是相同的。
我找到了一种解决方法,我将把它作为答案发布,以便其他人可以受益。但是它不是很透明,所以如果有人可以告诉我上面的代码是否有效并且这是 VC++ 不兼容,或者如果它无效,那么为什么以及如何使它有效?
【问题讨论】:
-
顺便说一句,
255不适合signed char(但适合unsigned char)。char可以签名。 -
static_assert总是会在某些编译器上触发,因为它不依赖于模板参数。 -
我认为您应该查看
traits而不是普通函数。 -
@Jarod42,谢谢我已经编辑了问题
-
@TartanLlama 好的,我没有意识到这一点。我猜那是因为编译器看不到对模板的依赖,所以将它编译为非模板函数或什么?我已经编辑添加了 sizeof(T) >0 ,我在其他地方看到过,但没有意识到需要。