2017-05-14 45 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

在'升壓::變體<提高::變體<用戶*,*東西>,升壓::變體<用戶*,東西* >>',這2種類型是相同的,它不爲'variant'意義。 – Jarod42

+0

'返回user_array [指數] .getPerson(登錄,密碼);'或'返回temp_u;'應該工作。 – Jarod42

回答

1

您可以考慮將boost::variant作爲改進的C++ union

例如,作爲unionboost::variant<User*, Stuff*>可以指針User或存儲指向Stuff但不像union,可以檢查哪個類型被存儲。

在您的例子聲明:

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

這意味着getPersonByKey情況傳回User*Stuff*。你可以從他們的任何選項構造一個變體,所以你可以返回一個這些類型的指針。

方法getPerson()未在您的示例中聲明,因此我無法完全重寫您的示例。但是,如果getPerson()返回User*,則可以直接返回其值,並將其轉換爲包含返回值的boost::variant<User*, Stuff*>

注意boost::variant<User*, Stuff*>必須要麼User*Stuff*。它不能爲空。所以,如果你返回一個默認的boost::variant<User*, Stuff*>,你實際上會返回一個默認的指針User

如boost ::變種是用來裝模板參數之一,它是沒有意義的聲明是這樣的:

boost::variant<T, T> 

因爲這意味着你可以存儲無論是T或和T.在這種情況下,你可以使用一個T型。

檢查變型中存儲哪種類型非常容易。最簡單的方法是使用get方法:

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

變量user將獲得一個指向存儲的值,如果一個指針User儲存或nullptr如果存儲了一個Stuff指針。訪問價值的方式有很多,例如使用訪問者。

你可以在variant tutorial找到更多的信息。