模板函数类型化为BinaryFunc

时间:2015-11-28 00:42:38

标签: c++ opencv

BinaryFunc在core.hpp中定义为

typedef void (*BinaryFunc)(const uchar* src1, size_t step1,
                       const uchar* src2, size_t step2,
                       uchar* dst, size_t step, Size sz,
                       void*);

BinaryFunc getConvertFunc(int sdepth, int ddepth)会返回一个模板

template<typename T, typename DT> static void
cvt_( const T* src, size_t sstep, DT* dst, size_t dstep, Size size )

如果cvt_总是被类型化为BinaryFunc,那么将cvt_作为模板有什么意义?例如,对于cvt8u32f,getConvertFunc应该返回cvt_<short, float>。但由于它是类型化的,它不会返回cvt_<uchar, uchar>吗?

此外,我尝试以下列方式复制convert.cpp中的代码:

template<typename TS, typename TD> static void
test_(TS src, TD dst) {
    dst = (TD)(src * dst);
    cout << src << " " << dst << " " << __func__ << endl;
}

#define GET_NAME(suffix, stype, dtype) \
    void test_##suffix(stype src, dtype dst) \
    {\
        test_(src, dst); \
    }

GET_NAME(32f32s, float, int)
GET_NAME(32f64f, float, double)

int main(int argc, char **argv) {
    typedef void (*func)(int, int);
    func f1 = (func)(&test_32f32s);
    func f2 = (func)(&test_32f64f);

    f1(2.4f, 1);
    return 0;
}

我在test_中得到src = 0。为什么会这样?

如果函数指针定义为

typedef void (*func)(float, int);

我得到了f1的预期结果。

编辑1:如果我拨打test_32f32s(2.4f, 1),我也会得到所需的结果。但我尝试复制BinaryFunc语法,但该语法不起作用。

编辑2:在typedef中使用void *以某种方式工作。这是代码

template<typename TS, typename TD> static void
test_(TS *src, TD *dst) {
    *dst = (TD)(*(TS*)src * *(TD*)dst);
    cout << *src << " " << *dst << " " << __func__ << endl;
}

#define GET_NAME(suffix, stype, dtype) \
    void test_##suffix(stype *src, dtype *dst) \
    {\
    test_(src, dst); \
    }

GET_NAME(32f16s, float, int)
GET_NAME(32f64f, float, double)

typedef void (*func)(void*, void*);

func getFunc(int type) {
    func fns[] = {(func)(test_32f16s),
           (func)(test_32f64f)};

    return fns[type];
}

int main(int argc, char **argv) {
    float tmpf = 10.0f; float *f = &tmpf;
    int tmpi = 2; int *i = &tmpi;
    double tmpd = 5.0; double *d = &tmpd;
    cout << *f << " " << *i << " " << *d << endl;

    func fnf = getFunc(0);
    fnf(f, i);
    func fnd = getFunc(1);
    fnd(f, d);
}

这只是为了理解这里使用的编码风格。

0 个答案:

没有答案