私はグローバル構造を持っています
template <class FLOAT>
struct Cstruct {
FLOAT var1;
FLOAT var2;
};
FLOAT は「double」または「int」にすることができます
グローバルな Cstruct オブジェクトを宣言したいのですが、コンパイル時に「double」になるか「int」になるかわかりません。これを達成する方法はありますか?前もって感謝します。
私はグローバル構造を持っています
template <class FLOAT>
struct Cstruct {
FLOAT var1;
FLOAT var2;
};
FLOAT は「double」または「int」にすることができます
グローバルな Cstruct オブジェクトを宣言したいのですが、コンパイル時に「double」になるか「int」になるかわかりません。これを達成する方法はありますか?前もって感謝します。
非常識なアプローチの 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、悲しみを大幅に軽減できます。比較的単純なプログラムに対してのみこれを行います。
コンパイル時にテンプレートのタイプを知っている必要があります。
実行時に型を把握する必要がある場合は、boost::variant<int, double>代わりに各属性を a にすることをお勧めします。
別のオプションは、ユニオンを使用することです。共用体を使用すると、同じメモリを 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 の場合)。