3

以前に定義してからパラメーターに渡すのではなく、関数呼び出し内でユニオンを一時的に定義することは可能ですか?

例:

           union data_t{
            double delaySeconds;
            float scale;
            float rotation;

            };

           void someFunction(data_t){}

someFunctionここで、ユニオンの適切な要素を使用して、を呼び出したいと思います。

            someFunction(WHAT DO I PUT HERE);

たとえば、コンストラクターを含む型を期待する関数に渡す場合、関数呼び出しで一時的なものを定義できます。しかし、私はこの組合でさまざまな方法を試しましたが、うまくいきませんでした。たとえば、に割り当てられた float を渡したいとしscaleます。

          someFunction(data_t.scale(2.0));
4

1 に答える 1

2

メンバーを初期化するために、共用体のコンストラクターを定義できます。ただし、どのフィールドが設定されたかを区別するメカニズムが必要です。以下では、ヘルパーを定義し、ヘルパーenumを拡張data_tして継承とメンバーの区別を可能にします。

enum data_t_type { DelaySeconds, Scale, Rotation };

struct data_t {
    union {
        double delaySeconds;
        float scale;
        float rotation;
    };
    union {
        unsigned char flags;
        struct {
            unsigned char isDelaySeconds : 1;
            unsigned char isScale : 1;
            unsigned char isRotation : 1;
        };
    };
    data_t () : flags(0) {}
};

これで、初期化は実際に をパラメータとしてtemplate取る で行われdata_t_typeます。

template <data_t_type> struct data_type {};

template <> struct data_type<DelaySeconds> : data_t {
    data_type (double x) { delaySeconds = x; isDelaySeconds = 1; }
};

template <> struct data_type<Scale> : data_t {
    data_type (float x) { scale = x; isScale = 1; }
};

template <> struct data_type<Rotation> : data_t {
    data_type (float x) { rotation = x; isRotation = 1; }
};

したがって、次のように関数を呼び出すことができます。

someFunction(data_type<Scale>(2.0));

adata_type<>は であるため、正しい型data_tを取得します。someFunction()

于 2013-05-11T07:26:44.173 に答える