0

次のデータ型が定義されています: float、float4、float8、double、double4、int、int4、int8、long (64 ビット 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
}

助言がありますか?テンプレートでこれを行うことはできますか? それとも、define ステートメントとテンプレートの組み合わせですか?

4

3 に答える 3

3

はい、この関数のグループを 1 つのテンプレート関数に変えることができます。

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 は単なる int の名前変更ではなく、4 つの整数 (実際には SSE レジスタに対応する) を持つデータ型であることを付け加えておきます。

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 に答える