1

3つの関数を作成するのではなく、1つの関数の引数として異なるオブジェクトを渡すことは可能ですか?

すなわち

void someFunction(Object o) {
     //working with object, all that objects have same fields to work with
     // i.e. all objects have x, y fields and this function is working with it
}

Player pl;
Item itm;
Block bl;

someFunction(pl);
someFunction(itm);
someFunction(bl);

多分それはテンプレートを使用して行うことができますか?異なるオブジェクトに対して同じコードで 3 つの関数を作成したくない

4

5 に答える 5

3

はい、テンプレートを使用します:

template<class Type> void someFunction(const Type& o) {
     //working with object, all that objects have same fields to work with
     // i.e. all objects have x, y fields and this function is working with it
}

oおそらく、値ではなく const 参照で渡すことを好むことに注意してください。私はここでこれをしました。

于 2012-10-08T15:31:30.387 に答える
1

テンプレートは、型のクラスのエイリアスとして使用できます。以下は、任意の型が のパラメータを通過できるようにしますf

template <typename T> void f(T & t) {
    // ...
}
于 2012-10-08T15:32:27.493 に答える
1

テンプレートは機能するはずですが、SFINAE を考慮しないと、指定されたすべてのオブジェクトにいくつかのフィールドがあることを保証できません。

別の解決策は、ここでいくつかのサンプルコードを継承することです:

struct Foo
{
    int x;
    int y;
};

struct Bar: public Foo
{
    int another_x;
};

struct Baz: public Foo
{
    int another_y;
};

void someFunction(const Foo &foo)
{
    std::cout << foo.x << '\n';
    std::cout << foo.y << '\n';
};

このアプローチにより、指定されたすべてのオブジェクトに必要なメンバーがあることを保証できます。

于 2012-10-08T15:41:51.513 に答える
1

はい、テンプレートは機能するはずです:

template <typename T>
void someFunction(T & o)
{
    // use o.x, o.y, o.z
}

元のオブジェクトを変更するかどうかに応じて、参照または const 参照で渡すことができます。

于 2012-10-08T15:30:55.000 に答える
0

これは、テンプレートまたはポリモーフィズム (おそらく、関連するフィールドを取得および設定するための仮想メソッドを備えた親インターフェイス) を使用して行うことができます。

テンプレートは機能し、おそらく適切に最適化されますが、同じフィールドがあるかどうかに関係なく、後で新しいオブジェクトを渡すことはできません。テンプレート関数を使用するために新しいコードと新しいオブジェクトをコンパイルすることはできますが、既存の呼び出しは単一の型でスタックします。

親インターフェイスと仮想メソッドを使用し、関数がそれらのメソッド (おそらくゲッターとセッター) を呼び出してフィールド操作を処理するようにすると、ランタイムがわずかに長くなり、そのインターフェイスから継承する必要があるという犠牲を払って、後でより多くの自由が得られます (それは、ただし、インターフェイスを実装している限り、いつでも新しいオブジェクトを関数に渡すことができます)。

于 2012-10-08T15:32:51.980 に答える