提升变量返回类型

时间:2017-05-14 13:22:05

标签: c++ boost

我对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 个答案:

答案 0 :(得分: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 :: variant用于保存其中一个模板参数,因此将它声明为没有意义:

boost::variant<T, T>

因为这意味着您可以存储T或T.在这种情况下,您只需使用T类型。

检查变体中存储的类型非常容易。最简单的方法是使用get方法:

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

如果存储了指向user的指针,则变量User将获得指向存储值的指针;如果存储了nullptr指针,则变量Stuff。有更多方法可以访问该值,例如使用访问者。

您可以在discussion中找到更多信息。