8

私はwxWidgetsを介してGUIアプリケーションを開発しています。GUI部分と「ロジック」部分の2つの部分があります。Logicの部分をwxWidgetsから完全に独立させたいです。しかし、GUIの1つのコンポーネントがwxVariantを返し、ロジック部分で使用する必要があります。

だから私はwxVariantをブーストするために「変換」する方法を探しています::variant

wxVariantは次のように機能します。

wxVariant v("37");
int i = v.GetInteger(); //i==37

だから私は次のようなことを考えています

string s = methodReturningWxVariant().GetString();
boost::variant bV(s);

//later in code e.g
bV.GetInt();
bV.GetBool();

このようにboost::Variant(またはboost :: Any)を使用することは可能ですか?

4

4 に答える 4

23

boost::variant多少の変更で使えそうです。まず、boost::variant格納するタイプを指定する必要があります。

boost::variant<int, string, bool> v;

おそらくいくつかの場所でこのタイプを使用するので、エイリアスを作成する必要があるでしょう。すなわち

typedef boost::variant<int, string, bool> myvar;

次に、myvar を直接使用できます。

myvar x = "hello";
myvar y = 20;
myvar z = false;

値を取得するには:

string s = boost::get<string>(x);
int i = boost::get<int>(y);
bool b = boost::get<bool>(z);

バリアントに格納されている型とは異なる型を取得しようとすると、例外がスローされます。

which() メンバー関数を使用して、バリアントの型を照会できます。バリアントが現在保持している型への 0 ベースのインデックスを返します。

switch (x.which()) {
case 0: // it's an int
case 1: // it's a string
case 2: // it's a bool
}
于 2011-03-28T14:17:46.547 に答える
4

簡単な答え?いいえ。文字列を介して変換することはできません。これにより、情報の損失が発生し、boost::variant文字列の解析が自動的に試行されません。

が明示的な変換を提供しているかどうかはわかりません。一般に、特殊なケースをテストせずwxVariantに変換するのは難しい場合があります。boost::variant

于 2011-03-28T14:09:14.017 に答える
1

boost::variant('v' を大文字にしないでください) 別の方法で動作します: 中に入れたものだけを取り戻すことができます。タイプセーフ(r)共用体と考えてください。

ドキュメントチュートリアルを確認することも問題ありません。

Boost.Any ライブラリは、この点で Boost.Variant と違いはありません (あなたが入れるものはあなたが得るものです :) ) が、boost::any無制限です: には任意の型の値を格納できますboost::anyが、boost::variantで宣言されたもののみを格納できますバリアントのテンプレート パラメータ。

于 2011-03-28T14:08:52.857 に答える
0

boost::variantは変換を行いません。strtol()sscanf()boost::lexical_cast<>()...など、文字列を整数に変換する方法は他にもあります。

于 2011-03-28T14:09:03.993 に答える