1

私の質問は、C++ 関数の引数に関連しています。場合によっては、1 つの関数がさまざまな種類の引数を受け入れることができると考えるかもしれませんが、私が考える限り、これは 2 つの方法で実現できます。1 つは C++ の新機能である関数のオーバーロード (ポリモーフィズム) を使用する方法で、もう 1 つは 'C' 関数の方法を使用する方法です。これを次の例に示します。

struct type0
{
    int a;
};

struct type1
{
    int a;
    int b;
};

struct type2
{
    int a;
    int b;
    int c;
};

void fun(int type, void *arg_structure)
{
    switch (type)
    {
    case 0:
        {
            struct type0 *mytype = (struct type0 *)(arg_structure);
            cout<<"a = "<<mytype->a<<endl;
            break;
        }

    case 1:
        {
            struct type1 * mytype= (struct type1 *)(arg_structure);
            cout<<"b = "<<mytype->b<<endl;
            break;
        }
    case 2:
        {
            struct type2 *mytype = (struct type2 *)(arg_structure);
            cout<<"c = "<<mytype->c<<endl;
            break;
        }
    default:
        break;
    }
}

int main () 
{
    struct type2 temp;
    temp.a = 1;
    temp.b = 2;
    temp.c = 3;
    fun(2,(void*)(&temp));

    return 0;
}

私の質問は: C++ で変更可能な関数引数構造を取得する他の方法はありますか?ありがとう!

4

3 に答える 3

5

「変更可能な引数の型」ではなく「変更可能な引数の構造」を求めているので、型と引数の数に関して柔軟性を求めていると思います。

その場合、可変引数関数を使用できます。

void fn ( int cnt_params, ... ) {...}

または、C++11 をサポートするコンパイラがある場合は、可変個引数テンプレート:

template <typename T, typename ...P>
void fn (T t, P ...p) {....}

それ以外の場合は、他の人がすでに提案しているように、オーバーロードまたはテンプレートを使用できます。

于 2012-10-02T09:24:01.637 に答える
3

C++ では、さまざまな種類のパラメーターを同じ関数に渡す方法がいくつかあります。最初に、パラメータの実際の型がいつ決定されるかを決定する必要があります-コンパイル時または実行時? この決定に応じて、適切なメソッドを使用して渡すことができます。

コンパイル時 (静的) 引数の型の場合:

これらのメソッドはタイプ セーフであり、優先する必要があります。

実行時 (動的) 引数の型の場合:

それらが提供する型の安全性boost::variantを使用することをお勧めします。boost::any他のメソッドはタイプ セーフではなく、通常、設計上の判断が不適切であると見なされます。本当に必要でない限り、それらを使用しないでください。または、使用しないように設計を改善してください。

于 2012-10-02T10:09:57.920 に答える
1

あなたはいくつかのことを混乱させています。関数のオーバーロードは、ポリモーフィズムとはまったく異なるものです。

可変引数リストである別のcの方法もあります。ここで例を説明します。printf()兄弟愛はこのメカニズムを使用して実装されていると思います。

配列の代わりに、または set のc++ようなほとんどすべてのコンテナーを使用できます。また、名前付き引数にも適している場合があります。std::vectorstd::map<string,Type>

混合タイプのセットが必要な場合は、ブーストtuples(+ 必要に応じてオーバーロード) を使用できます。

c++テンプレート メカニズムが役立つ場合があります。

標準のコンテナ、タプル、テンプレート、オーバーロード、およびそれらの組み合わせで、引数を処理するユースケースの 99% をカバーできると思います。

于 2012-10-02T09:32:43.087 に答える