На основе следующей шаблонной структуры, используемой в качестве средства доступа к пикселям.
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, ...)
Я сделал следующую функцию для работы только с пикселями uchar и float, которые являются 3 каналами.
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 канала в пикселях, какой бы там ни был тип?
template<typename T, typename = typename std::enable_if<std::is_base_of< PixelAcessor<std::any, 3>,T>::value>::type>
Я хотел бы иметь решение на C ++ 11, но если есть необходимость в более новом компиляторе, я открытк решению и посмотреть, что я делаю.