1

したがって、2つの文字と2つのintを必要とする関数があります。

void need_2xcha_2xint(char a, char b, int x, int y)
{
  cout << "Working! a: " << a << ", b: " << b << ", x : " << x << ", y: " << y << ".\n";
}

4つの値を含む単一の構造体を渡すことによってそれを呼び出したいと思います。

struct Value_Holder
{
char a;
char b;
int x;
int y;

Value_Holder()
    : a('g'), b('h'), x(3), y(5)
  {
  }
};

私はそれを次のように呼ぶことができるようにしたいと思います:

Value_Holder vh;
need_2xcha_2xint(vh);

もちろん、カスタム構造を受け入れて適切に処理する別の関数を作成することもできますが、4つの個別の値を直接出力するように構造体に指示する方法があるかどうか疑問に思いました。これは主にDirectXライブラリとの対話に使用されます。

これは基本的なことだと思いますが、私はC ++の非常に多くの異なる領域に取り組んできたので、すべてを覚えるのは難しいです。しばらく答えを探してきましたが、何を探すべきかよくわかりません。私のグーグルスキルは私を失敗させます!

前もって感謝します。

  • 編集 -

人々は私の質問に混乱しているように見えるので、ここでそれを単純化しようとします:

4つの別々の値の代わりにこれらの値を保持する単一の構造を受け入れるために2つのintと2つのcharを必要とする関数の方法はありますか?

それが私の質問を明確にすることを願っています。

4

6 に答える 6

3

サードパーティのライブラリをラップします。

namespace david {

void need_2xcha_2xint(const Value_Holder& value) {
    ::need_2xcha_2xint(value.a, value.b, value.x, value.y);
}

}

それを使用する:

int main() {
    Value_Holder value;

    using david::need_2xcha_2xint;
    need_2xcha_2xint(value);
    return 0;
}

編集

テンプレートと関数ポインタを使用してこれをカプセル化できると確信しています。

于 2013-01-18T08:58:06.360 に答える
1

構造体に 4 つの個別の値を直接出力するように指示する方法

出力を a std::ostream(例: std::cout) にする場合は、Value_Holder のストリーミング演算子を追加します...

std::ostream& operator<<(std::ostream& os, const Value_Holder& v)
{
    return os << "{ a " << v.a << ", b " << b.b << ", x " << x << ", y " << y << " }";
}

次に、例を使用して簡潔に印刷できます。

Value_Holder v;
...
std::cout << "whatever " << v << " some more\n";
于 2013-01-18T08:42:59.087 に答える
1

fuchsgeist が提供する答えが最善の方法だと思います。私が正しいことを理解するには、ライブラリ関数に 4 つのパラメーターを渡す必要があります。以下のコードで問題が解決したことを願っています。

Value_Holder vh;
need_2xcha_2xint(vh.a,vh.b,vh.x,vh.y);

あなたの問題を正しく理解できたと思います。

わかりました、編集後に質問を受け取りました。ここで関数のオーバーロードの概念を使用できます。ライブラリ関数をオーバーロードして、構造を受け入れます。それは問題の解決策になりますか?

于 2013-01-18T08:55:52.157 に答える
1

関数にいくつかのパラメーターを渡す必要があるということは、下位のオブジェクトが必要であるという結論につながります。あなたの場合、構造体を作成しました。

ただし、クラスの責任について考える必要がある単一責任の原則を忘れないでください。

あなたの場合、よくわかりませんが、 (int x, int y) を見るたびに、クラス PointまたはVector、またはクラス Sizeが危険にさらされているのではないかと思います。もしそうなら、問題の新しいクラスに int x, int y のペアだけをカプセル化します。

このような質問については、Martin Fowler 著の本「Refactoring: Improving the Design of Existing Code」をお勧めします。彼は、コードを変更する方法、コードをより保守しやすく、変更可能な状態にする方法、コードをリファクタリングするタイミングと理由をリストします。

于 2013-01-18T09:29:15.717 に答える
1

2 つの int と 2 つの char を必要とする関数が、4 つの個別の値ではなく、これらの値を保持する単一の構造体を受け入れる方法はありますか?

いいえ、ありません。

プリプロセッサでさまざまなトリックを試すことができますが、それは間違った行き止まりの方法です。

構造体を使用しないのはなぜですか?できるだけ頻繁にKISS の原則に従ってください。

于 2013-01-18T09:15:51.837 に答える
1

これはあまり良い決定ではないことはわかっています。また、定義を避ける必要がありますが、とにかく、これを試すことができます。

void f(int i, char c)
{
    std::cout << i << " : " << c;
}

struct s
{
    int i;
    char c;
};

#define S_CALL(f, s) (f(s.i, s.c))

int main(int argc, char* argv[])
{
    s param;
    param.i = 1;
    param.c = 'a';

    f(param.i, param.c);
    S_CALL(f, param);

    return 0;
}

もちろん、この関数を独自にラップすることもそう遠くありません。

于 2013-01-18T09:01:24.013 に答える