何度か、質問させていただいているものです。初心者です。
VC++を使っています。
質問なのですが、構造体を作りました。その中に(メンバっていうのですか?)変数を入れていくのですが、
そのうちの1つに何の型が入るか分からない変数が必要になりまして、この変数を、なんでも入るような型にする事は可能ですか?void*型?がそんな働きをするようなのですが、これはポインタですし、char型とか、int型とかは、直接入らないらないからできないような。出来るんですかね?分かりずらくて申し訳ありません。
何が入るか分からないといっても、int型やchar型など3~4個などで、全部つくってもいいような気もするのですが、無駄が多いような気がするので、良い方法を探しています。お願いします。
変数
Re:変数
softyaさん、たかぎさん、ていねいな回答ありがとうございます。
C++の文法で作成しているつもりです。
プログラムを実行して入力されたデータを変数のようにして扱えるプログラムを作りたいんです。
実行者に変数名とデータを入力してもらい構造体に変数の名前と、データのメンバを作ってそこに情報入れたいのです。変数名は文字列が入るのでchar型でいいのですが、データのほうは、文字列か数字(整数以外も含む)かなどがわからない(ただ、ポインタは入らないです)ので、このような質問をしたのですが、まだ理解が浅くいい方法が分かりませんでした。このようなプログラムの場合、どのようにするのが効率がいいのでしょうか?
ポリモーフィズムを調べてみたのですが、どういうものなのか分かりませんでした。
boost::anyも調べてみたのですが、使う時にキャスト?しなければいけないとのことなのですが、どのようにすればいいのか分かりませんでした。キャストはどうやればいいのでしょうか?
>>本当のCなら共用体でもよいのですが、C++をCのように使っているだけであれば、C互換型(POD型)かどうかの判断が正確にできるのでないかぎり、共用体は使うべきではありません。
もうこの文章が何を意味しているのか分からないので使わないほうがいいんですね。たぶん。
C++の文法で作成しているつもりです。
プログラムを実行して入力されたデータを変数のようにして扱えるプログラムを作りたいんです。
実行者に変数名とデータを入力してもらい構造体に変数の名前と、データのメンバを作ってそこに情報入れたいのです。変数名は文字列が入るのでchar型でいいのですが、データのほうは、文字列か数字(整数以外も含む)かなどがわからない(ただ、ポインタは入らないです)ので、このような質問をしたのですが、まだ理解が浅くいい方法が分かりませんでした。このようなプログラムの場合、どのようにするのが効率がいいのでしょうか?
ポリモーフィズムを調べてみたのですが、どういうものなのか分かりませんでした。
boost::anyも調べてみたのですが、使う時にキャスト?しなければいけないとのことなのですが、どのようにすればいいのか分かりませんでした。キャストはどうやればいいのでしょうか?
>>本当のCなら共用体でもよいのですが、C++をCのように使っているだけであれば、C互換型(POD型)かどうかの判断が正確にできるのでないかぎり、共用体は使うべきではありません。
もうこの文章が何を意味しているのか分からないので使わないほうがいいんですね。たぶん。
Re:変数
>変数名は文字列が入るのでchar型でいいのですが、データのほうは、文字列か数字(整数以外も含む)かなどがわからない
なるほど、スクリプト言語の様な物を作っているのですね。
私は別々のメンバにするのを推奨します。文字列なら構造体に入れる場合、stringとかクラスを使ったほうが良いですね。数値は、int型とdouble型で十分じゃないでしょうか。
今使っている型は、構造体中に型を記録するメンバ変数を追加してください。
それと、変数名も文字列ですが検索する必要があると思うので、stlのmapとかを使ったほうがスマートになると思います。
連想配列(map)。たかぎさんのサイトより。
http://www.kijineko.co.jp/tech/cppsamples/map.html
それと、一番スッキリするのは構造体自体を変数処理クラスにして全てカプセル化する事ですかね。
なるほど、スクリプト言語の様な物を作っているのですね。
私は別々のメンバにするのを推奨します。文字列なら構造体に入れる場合、stringとかクラスを使ったほうが良いですね。数値は、int型とdouble型で十分じゃないでしょうか。
今使っている型は、構造体中に型を記録するメンバ変数を追加してください。
それと、変数名も文字列ですが検索する必要があると思うので、stlのmapとかを使ったほうがスマートになると思います。
連想配列(map)。たかぎさんのサイトより。
http://www.kijineko.co.jp/tech/cppsamples/map.html
それと、一番スッキリするのは構造体自体を変数処理クラスにして全てカプセル化する事ですかね。

Re:変数
> boost::anyも調べてみたのですが、使う時にキャスト?しなければいけないとのことなのですが、どのようにすればいいのか分かりませんでした。キャストはどうやればいいのでしょうか?
boost::any x = 123;
int y = boost::any_cast<int>(x);
x = std::string("abc");
std::string s = boost::any_cast<std::string>(x);
上記のように行います。
いっそのことデータは文字列で持って、取り出すときにboost::lexical_castを使うのも一つの手です。
こんなかんじです。
std::map<std::string, std::string> var;
std::string name = "変数名";
std::string value = "123";
var[name] = value;
int x = boost::lexical_cast<int>(var[name]);
boost::any x = 123;
int y = boost::any_cast<int>(x);
x = std::string("abc");
std::string s = boost::any_cast<std::string>(x);
上記のように行います。
いっそのことデータは文字列で持って、取り出すときにboost::lexical_castを使うのも一つの手です。
こんなかんじです。
std::map<std::string, std::string> var;
std::string name = "変数名";
std::string value = "123";
var[name] = value;
int x = boost::lexical_cast<int>(var[name]);