C++ 定义使用此类型作为模板参数的类型和函数

C++ 定义使用此类型作为模板参数的类型和函数,c++,C++,我正在做一个函数来在CPU上生成mip映射。 我的目标是编写通用函数,它将适用于许多DXGI_格式。函数对所有DXGI_格式组合执行相同的操作,唯一的区别是数据类型和用于加载和存储它的XMMATH函数 我试着用一种很好的方式——通过模板参数,如下所示: #define AVERAGE(p, q) (((p - q) * 0.5f) + q) template<typename XMATH_PIXEL_FORMAT, typename XMVECTOR(*XMATH_LO

我正在做一个函数来在CPU上生成mip映射。 我的目标是编写通用函数,它将适用于许多DXGI_格式。函数对所有DXGI_格式组合执行相同的操作,唯一的区别是数据类型和用于加载和存储它的XMMATH函数

我试着用一种很好的方式——通过模板参数,如下所示:

#define AVERAGE(p, q) (((p - q) * 0.5f) + q)

template<typename XMATH_PIXEL_FORMAT,
         typename XMVECTOR(*XMATH_LOAD_FUNC)(const XMATH_PIXEL_FORMAT*),
         typename void(*XMATH_STORE_FUNC)(XMATH_PIXEL_FORMAT*, XMVECTOR)>
void minifyMipMap(XMATH_PIXEL_FORMAT* dst, const XMATH_PIXEL_FORMAT* src, size_t src_x, size_t src_y) {
  size_t x, y, x2, y2, dst_x = src_x >> 1, dst_y = src_y >> 1;
  XMVECTOR out, p00, p10, p01, p11; // p:xy

  for(y = 0; y < dst_y; ++y) { // for each dst line
    y2 = y << 1; // y2 = y * 2
    for(x = 0; x < dst_x; ++x) { // for each dst pixel
      x2 = x << 1; // x2 = x * 2

      // load 4 pixels
      p00 = XMATH_LOAD_FUNC(src + y2 * src_x + x2);
      p10 = XMATH_LOAD_FUNC(src + y2 * src_x + x2 + 1);
      p01 = XMATH_LOAD_FUNC(src + (y2 + 1) * src_x + x2);
      p11 = XMATH_LOAD_FUNC(src + (y2 + 1) * src_x + x2 + 1);

      // blend 4 pixels into 1
      out = AVERAGE(AVERAGE(p00, p10), AVERAGE(p01, p11));

      // store dest pixel
      XMATH_STORE_FUNC(dst + y * dst_x + x, out);
    }
  }
}


void test() {
  BYTE src[] = {
    0, 0, 0, 255, // black
    255, 255, 255, 255, // white
    0, 0, 0, 255, // black
    255, 255, 255, 255 // white
  };
  XMUBYTE4 dst[1]; // gray ???

  minifyMipMap<XMUBYTE4, XMLoadUByte4, XMStoreUByte4>(dst, (const XMUBYTE4*)src, 2, 2); // 2x2 = > 1x1
}
定义平均值(p,q)((p-q)*0.5f)+q) 模板 void minifyMipMap(XMATH_PIXEL_FORMAT*dst,const XMATH_PIXEL_FORMAT*src,size_t src_x,size_t src_y){ 尺寸x,y,x2,y2,dst_x=src_x>>1,dst_y=src_y>>1; XMVECTOR out,p00,p10,p01,p11;//p:xy 对于(y=0;yy2=y如果要接受任意函数,请不要这样做。请为每个不同的函数接受一个模板参数

template<typename Func>
void foo(Func f) {
  // call f in any way you need
  f();
}

// can be used like this with functions
void bla() {}
f(&bla);
// Functors
struct X { void operator()() {} }
f(X());
模板
无效foo(函数f){
//用任何你需要的方式呼叫f
f();
}
//可以像这样与函数一起使用
void bla(){}
f&bla;
//函子
结构X{void操作符()(){}
f(X());
如果传递的函数不能以代码调用的方式调用,编译器将发出抱怨


如果你想真正帮助你的用户,你可以用
static\u assert
提供一些有限形式的概念检查和一些元编程。

我犯了一个可怕的错误,这不起作用,因为void(XMMATH\u STORE\u FUNC)(XMATH\u PIXEL\u格式,XMVECTOR)应该是第二个参数中的FXMVECTOR,而不是XMVECTOR,这是一个假警报:>这个模板代码在msvc 2012ANK下工作以获得答案,现在我经常创建这样的functors类