0

我定义了以下数据类型:float、float4、float8、double、double4、int、int4、int8、long(64bit int)和 long4。假设我定义了以下函数:

void foo_float() {
  float f;
  int i;
  ...do something with f and i
}

void foo_float4() {
  float4 f;
  int4 i;
  ...do something with f and i
}

void foo_double4() {
  double4 f;
  int4 i;
  ...do something with f and i
}

说“用 f 和 i 做某事”的部分是相同的。所以我不想写重复的代码。我想改为做类似的事情:

<float, 4>foo()

这会生成函数:

void foo() {
    float4 f;
    int4 i;
    ...do something with f and i
}

有什么建议么?我可以用模板做到这一点吗?或者也许是定义语句和模板的组合?

4

3 回答 3

3

是的,您可以将这组函数转换为单个模板函数:

template<typename float_type, typename int_type>
void foo() {
  float_type f;
  int_type i;
  ...do something with f and i
}

然后像这样使用它:

foo<float4, int4>();
于 2013-03-24T11:05:36.960 回答
3

当然,这样做:

template <typename Tf, typename Ti>
void foo() {
  Tf f;
  Ti i;
  ...do something with f and i
}

像这样调用它:

foo<float4, int4>();
于 2013-03-24T11:06:06.110 回答
1

所以一位朋友向我展示了如何做到这一点,以防有人感兴趣。现在,如果我将 float4 传递给函数,我也会得到一个 int4。我应该补充一点,int4 是具有四个整数的数据类型(实际上它对应于一个 SSE 寄存器),而不仅仅是对 int 的重命名。

template <typename F> struct Tupple {

};

template<> struct Tupple<float> {
    typedef int Intn;
};

template<> struct Tupple<float4> {
    typedef int4 Intn;
};

template<> struct Tupple<float8> {
    typedef int8 Intn;
};


template<> struct Tupple<double4> {
    typedef long4 Intn;
};

template <typename Floatn>
void foo(typename Floatn a) {
    typename Tupple<Floatn>::Intn i;
    Floatn b;
    i = (a < b);
    //do some more stuff
 }

int main() {
    float4 a;
    float8 b;
    float c;    
    double4 d;

    foo(a);
    foo(b);
    foo(c);
    foo(d);
}
于 2013-03-25T10:57:58.510 回答