私はグローバル構造を持っています
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 か所で複製することです。
Program
template
関数や特性、その他の同様のデータ コレクションなど、他の を使用でき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 の場合)。