1

私はグローバル構造を持っています

template <class FLOAT>
struct Cstruct {
    FLOAT var1;
    FLOAT var2;
};

FLOAT は「double」または「int」にすることができます

グローバルな Cstruct オブジェクトを宣言したいのですが、コンパイル時に「double」になるか「int」になるかわかりません。これを達成する方法はありますか?前もって感謝します。

4

3 に答える 3

0

非常識なアプローチの 1 つは、プログラム全体を大きな .xml にすることtemplateです。

この大きなtemplate<class Float> struct Program { ... };では、関数のメソッドを使用staticします。

実行時に、プログラムが a を使用しているdoubleか aを使用しているかがわかっている場合float(願わくば!)、それを把握してから、d プログラムの主要なエントリ ポイントであるProgram's のそのバージョンを実行します。static void main()template

ここで、すべてがこの 内に存在できるわけではありませんProgram template。クラス内ではクラス外とは異なることを実行できるためです。 のポイントはProgram、メイン コード フローと「グローバル状態」を 1 か所で複製することです。

Programtemplate関数や特性、その他の同様のデータ コレクションなど、他の を使用できstaticます。関数を呼び出して、関連する型に基づいてオーバーロードの解決を行うこともできます。

Programが何であるかを実際に知る必要がある部分を特定できればFloat、悲しみを大幅に軽減できます。比較的単純なプログラムに対してのみこれを行います。

于 2013-06-26T15:42:36.487 に答える
0

コンパイル時にテンプレートのタイプを知っている必要があります。

実行時に型を把握する必要がある場合は、boost::variant<int, double>代わりに各属性を a にすることをお勧めします。

于 2013-06-26T15:38:12.547 に答える
0

別のオプションは、ユニオンを使用することです。共用体を使用すると、同じメモリを int または double として使用できます。

union DoubleOrInt
{
    double dValue;
    int iValue;
};

struct Cstruct
{
    DoubleOrInt var1;
    DoubleOrInt var2;
};

必要な型がわかっている場合は、Cstruct でメモリにアクセスします。

Cstruct Test;
Test.var1.iValue = 1;
Test.var2.dValue = 2.0;

double の代わりに整数を使用することになった場合、このメソッドはユニオンごとに 4 バイトを浪費することに注意してください (int 変数と double 変数の標準サイズがそれぞれ 4 と 8 の場合)。

于 2013-06-26T15:48:32.003 に答える