0

私はこのようなことが起こっているコードの一部を持っています

     type<X> function( args<x> g)
     {
        ...
        function2();
        .....
     } 

現在、X は type1 と type2 の 2 つのタイプにすることができます。関数を型 function( args g) { ... として書きたい

        if X is of type1 then call function2();
        if X is of type2 then call function3();
        .....
     }

どうすればこれを達成できますか。私は C++ で書き、ビジュアル スタジオで開発しています。

ありがとう

4

3 に答える 3

1

テンプレートの特殊化または関数のオーバーロードのいずれかを使用できます。例えば:

template <class X>
int foo(std::vector<X> a)
{
  foo1(); 
}

template <>
int foo<int>(std::vector<int> a)
{
  foo2(); 
}

関数をいくつかの型だけに特化する必要がある場合は、関数のオーバーロードを使用することをお勧めします。似たようなコードがたくさんあり、唯一の違いが 1 つの関数呼び出しにある場合は、次を使用できますtypeid

if (typeid(X) == typeid(type1)) {
  function2()
} else if (typeid(X) == typeid(type2)) {
  function3()
}
于 2012-12-07T20:59:11.160 に答える
1

注: タイプに基づいて比較するコードは、通常、設計が不十分であることを示しています。

異なる署名を持つ 1 つの関数を使用できます。

void my_function(const type_1& t1);
void my_function(const type_2& t2);

コンパイラーがパラメーターの型に基づいて関数を選択できるようにします。

于 2012-12-07T21:00:08.243 に答える
1

Xはクラスだと思いますか?仮想関数を使用し、X の派生バージョンを作成する必要があります。以下の例を参照してください。

class X
{
public:
    virtual void myFunction(int input) { // do stuff here... }
};

class Y : public X
{
public:
    void myFunction(int input) { // do overridden stuff here... }
};

次に、タイプ X のオブジェクトを作成し、それに対して myFunction() を呼び出すと、「do stuff here」コードが実行されます。タイプ Y のオブジェクトを作成し、それに対して myFunction() を呼び出すと、代わりに「ここでオーバーライドされたものを実行する」コードが実行されます。ただし、次のように、ポリモーフィックな方法で作成したオブジェクトを使用できます。

X *obj = NULL;

if (condition met)
{
    obj = new X();
}
else
{
    obj = new Y();
}

obj->myFunction(myInput); // will call either X or Y's myFunction() depending on what type it is
于 2012-12-07T21:01:13.407 に答える