2017-05-14 13 views
1

私はboost::variantについての質問があり、メソッドの正しい使い方をしています。例えば、私はStuffUser のようなクラスを持っていると私は、関数(擬似コード)を持つ:ブーストバリアント返品タイプ

boost::variant<User*, Stuff*> HashTable::getPersonByKey(string login, string password, string list_type) 
    { 
    int index = hash(login, password); 
    boost::variant<User*, Stuff*> temp_u, temp_s; 
    if (list_type == "User") 
    { 
     if (user_array[index].getPerson(login, password)) 
     { 
      temp_u = user_array[index].getPerson(login, password); 
      //returns User* 
      //maybe something like variant<User* , Stuff*> (temp_u); 
      return VARIANT 
     } 
    } 
    else if (list_type == "Stuff") 
    { 
     if (user_array[index].getPerson(login, password)) 
     { 
      temp_s = stuff_array[index].getPerson(login, password); 
      //returns Stuff* 
      //maybe something like variant<User* , Stuff*> (temp_s); 
      return VARIANT 
     } 
    } 
    return boost::variant<User*, Stuff*>(); 
} 

はどのようにリターンが可能になっていますか?

は私が

boost::variant<boost::variant<User*, Stuff*>, boost::variant<User*, Stuff*>>getPerson() 
{ 
    boost::variant<boost::variant<User*, Stuff*>, boost::variant<User*, Stuff*>> temp_user1, temp_stuff1 , 
    temp_user2 , temp_stuff2; 
    temp_u = user_array[index].getPerson(login, password); 
    return variant<variant <User* , Stuff*> ,variant <User* , Stuff*>> (temp_user1); 
} 

は私が何とか明示的バリアントtemp_personが所属している表示する必要があります...のようなものがさらに複雑にすることはできますか? これをオブジェクトから取り除くことは問題になりますか?

+1

代わりに継承したくないですか? – Jarod42

+1

boost :: variant 、boost :: variant > 'では、2つの型は同じですが、variantには意味がありません。 – Jarod42

+0

'return user_array [index] .getPerson(ログイン、パスワード);または' return temp_u; 'が動作するはずです。 – Jarod42

答えて

1

boost::variantについては、C++ unionと考えることができます。

例えば、unionとして、boost::variant<User*, Stuff*>StuffUserへのポインタかポインタを格納することができますが、unionとは異なり、あなたが保存されているタイプ確認することができます。

あなたの例では、宣言:

boost::variant<User*, Stuff*> getPersonByKey(string login, string password, string list_type) 

それはgetPersonByKey戻りUser*またはStuff*のどちらかということを意味します。任意のオプションからバリアントを構築することができるので、それらの型のポインタを1つだけ返すことができます。

メソッドgetPerson()はあなたの例では宣言されていないので、例を完全に書き換えることはできません。ただし、getPerson()User*を返す場合は、その値を直接返すことができ、返された値を含むboost::variant<User*, Stuff*>に変換されます。 boost::variant<User*, Stuff*>User*またはStuff*のいずれかでなければならないこと

は注意してください。それは空ではありません。したがって、デフォルトのboost::variant<User*, Stuff*>を返すと、実際にはUserへのデフォルトポインタが返されます。それはあなたがTかとT.のいずれかを保存することができることを意味しているので

boost::variant<T, T> 

ブーストとして::バリアントは、テンプレートパラメータの1保持するために使用され、それが好きで宣言するのは意味がありませんこの場合、Tタイプを使用することができます。

バリアントにどのタイプがストアされているかを確認するのは非常に簡単です。 Stuffポインタが格納されていた場合Userへのポインタが格納されているかnullptrれた場合に格納された値へのポインタを取得します

User **user = boost::get<User*>(&variant); 

変数user:最も簡単な方法は、getメソッドを使用することです。訪問者の使用のように、値にアクセスするにはさらに多くの方法があります。

さらに詳しい情報はvariant tutorialにあります。

関連する問題