基于以下模板化结构,用作像素访问器。
template<class T, std::size_t N>
struct PixelAccessor
{
T ch[N];
};
using pxUChar_C1 = PixelAccessor<unsigned char, 1>;
using pxUChar_C3 = PixelAccessor<unsigned char, 3>;
using pxUChar_C4 = PixelAccessor<unsigned char, 4>;
using pxFloat_C1 = PixelAccessor<float, 1>;
using pxFloat_C3 = PixelAccessor<float, 3>;
using pxFloat_C4 = PixelAccessor<float, 4>;
// etc. for all other types (int, short, ushort, ...)
我制作了以下函数,仅适用于 3 个 channel 的 uchar 和 float 像素。
template<typename T, typename = typename std::enable_if<std::is_same<T, pxUChar_C3>::value || std::is_same<T, pxFloat_C3>::value>::type>
bool function(Image img) {
// where getData is uchar*, and cast to T** allow 2D accessing
auto imgPtr = (T**)img->getData();
}
是否有办法执行以下操作或类似操作?我想启用所有 3 个 channel 像素,到底是什么类型?
template<typename T, typename = typename std::enable_if<std::is_base_of< PixelAcessor<std::any, 3>,T>::value>::type>
我想要一个 C++11 解决方案,但如果需要更新的编译器,我愿意接受解决方案并看看我能做什么。
最佳答案
若要获取任何 PixelAccessor
的函数,其中 N
是 3
那么您不需要 enable_if
和 SFINAE。刚刚使用
template<typename T>
return_type function_name(PixelAccessor<T, 3> parameter_name)
{
// stuff
}
将为您提供一个接受任何类型的 PixelAccessor
且大小为 3 的函数。
关于c++ - 如果仅使用模板,则启用模板功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55104669/