0

関数のオーバーライドがNあるとします。引数の配列を受け取り、それをいくつかの型に解析します (最初に , , を取得intstringstring2 回目にint, int,を取得するとしintます); ここで、引数の最初のセットcall(int, string, string)を 2 回目に呼び出す必要がありますcall(int, int, int)。引数の型が配列で、その場で呼び出す関数を検出できますか?

4

3 に答える 3

1

関連するパラメーターを使用して、オーバーロードされたメンバー関数を単純に記述できますか?

不明な数の引数を受け取り、それらに基づいて正しい関数を呼び出したい場合は、追加の作業が必要になります。おそらく、パラメーターセットを意味する最初のパラメーターとして列挙型を使用します。

enum eParamList
{
    eParamList_START,
    IntIntInt,          // following data is 3 ints
    IntIntChar,         // following data is int, int, bool (only joking its a char)
    eParamList_ENDS
}

または、このようなものですか?

于 2012-06-15T11:52:02.063 に答える
1

実行時にC++で型の選択を行うことはできません。これは、C++が厳密に型指定された言語の 1 つであるためです。

Python などで提案していることと同様のことを行うことができます。ここでは、実行時に変数の型を喜んで変更します。

継承クラスと派生クラスを使用して、似たようなことを行うことができますが、まったく同じではありません。スーパークラスがある場合は、スーパークラスへのポインターを返す「ファクトリー」関数を使用できます (一部の入力に応じて diff オブジェクトを含みます)。すべてのオブジェクトに必要な機能が実装されている場合は、ポインターで関数を呼び出すことができます。例えば:

class Base{
    virtual void functionality();
};

class Squirrel : public Base{
    void functionality() {
        std::cout << "I love hazelnuts!" << std::endl;
    }
};

class Box : public Base{
    void functionality() {
        std::cout << "Stuff can be put in here!" << std::endl;
    }
};


Base *factoryMethod(std::string someInput){
     if (someInput == "1")
         return new Squirrel();
     else
         return new Box();
}

int main(void){
    std::cin >> input;
    Base *object = factoryMethod(input);
    object->functionality();
    return 0;
}
于 2012-06-15T10:34:35.843 に答える
1

これはローテクな方法です。引数型配列の意味が正確にはわかりませんがargs、 と呼ばれるある種のベクトルが与えられ、要素が数値であるかどうかを判断し、要素を数値または文字列に変換できると仮定しましょう。次に、次のようなループを実装できます。

std::string s[3];
int n[3];
unsigned mask = 0;
for (int i = 0; i < args.size(); ++i) {
    if (is_number(args[i])) {
        mask |= (1U << i);
        n[i] = get_number(args[i]);
    } else {
        s[i] = get_string(args[i]);
    }
}

次に、マスクをオンにします。

switch (mask) {
case 0x01: call(n[0], s[1], s[2]); break;
case 0x07: call(n[0], n[1], n[2]); break;
default:
    std::cout << "unhandled combination: " << mask << std::endl;
    break;
}
于 2012-06-15T15:12:33.087 に答える