ユーザーが使用したいデータのタイプを選択できるようにしました。たとえば、long や double などを使用したい場合などです。最初に変数の名前を宣言してから、そのタイプを設定したいと思います。C++で可能ですか?
4 に答える
私があなたの質問を正しく理解した場合、あなたはこれをしたいと思います:
declare variable;
// in the program:
variable = (int) anotherVariable;
短い答え:
いいえ
長い答え:
avoid *
はまさにこれを行います。逆参照する前に、明示的に別の型に変換する必要があります。ただし、これはsではない変数では不可能void *
です。
void *variable = NULL;
int someIntVariable = 100;
int *someIntPointer = NULL;
variable = &someIntVariable;
someIntPointer = (int *)variable;
.. // but this seems unncessary.
(Windowsを使用してVARIANT
いる場合)または他のプラットフォームで同様のものを使用することを検討してください。重要なのVARIANT
は、すべての種類のデータ型を格納できるのはユニオンですが、一度に1つの特定の型のみを格納できるということです。このようにして、新しいジェネリック変数タイプ()を事前に定義し、VARIANT
ユーザーの選択に応じて、実行時にその内部タイプを適応させることができます。
ただし、のようなものを使用VARIANT
すると、その操作を実行するたびに、その操作が現在の基になるタイプに対して正しいかどうかを確認する必要があるため、コストがかかります。VARIANT
また、ユニオンには独自のオーバーヘッドがあるため、より多くのメモリを使用します(詳細については定義を参照してください)。
使用法を単純化するために、バリアント操作をクラスにラップすることをお勧めします。VARIANT
対照的に良い点void*
は、型の安全性が大幅に向上し、コードが読みやすくなることです。
編集:別の答えが指摘したように、boos::variant
これはこの目的のためです。
boost::variant
または、POD のみが必要な場合は、をご覧くださいunion
。ただし、これは多くのことを複雑にすることに注意してください。
enum VariantType {
USER_INT, USER_DOUBLE
};
union Variant {
int i;
double d;
}
int main() {
VariantType type;
Variant data;
type = getUserDataType();
switch(type) {
case USER_INT:
data.i = 42;
break;
case USER_DOUBLE:
data.d = 42.0;
break;
default:
break;
}
...または、準備が整った Variant の実装を使用します。