c++ - 如果仅使用模板,则启用模板功能

标签 c++ c++11 templates

基于以下模板化结构,用作像素访问器。

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 的函数,其中 N3 那么您不需要 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/

相关文章:

c++ - 将依赖的模板类加为好友

c++ - 从模板类继承并使用继承其构造函数

c++ - std::result_of 用于左值/右值参数

c++ - 展平 n 维 vector

c++ - photoshop 如何将两个图像混合在一起?

c++ - 可以使用临时的 stringstream 对象吗?

c++ - 如何改进自引用模板的实现?

c++使用类成员作为模板参数

c++ - 如何解决错误 MSB6006 : "cmd.exe" exited with code 3?

c++ - 如何使用 DrawText() 显示变量?