删除变量分配的重复行

时间:2019-03-17 12:27:59

标签: c++

我目前正在做一个项目,在一个班上,我将从用户输入中吸收大量变量。有没有办法阻止这样的事情:

class Person
{
    std::string firstName,
                lastName,
                DoB,
                address;

    int personID,
        durationMins,
        totalVisits;

void setValues(std::string values[])
{
    firstName = values[0];
    lastname = values[1];
    DoB = values[2]; 
    // ... etc
}
};

我想避免有大量专用于变量分配的行,尽管我不知道这是否可能。任何帮助,将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:4)

可以通过简单的可变参数模板函数来解决:

template <typename T, typename ...P> void AssignArrayElementsTo(const T *array, P &... objects)
{
    std::size_t i = 0;
    ((objects = array[i++]) , ...);
}

// ...

void setValues(std::string values[])
{
    AssignArrayElementsTo(values, firstName, lastName, DoB, address);
}

不幸的是,C ++还没有反射,因此您仍然需要手动列出所有需要的类成员。没有办法解决。

答案 1 :(得分:2)

在C ++ 11及更高版本中,可以使用CardAction或辅助函数std::reference_wrapper生成成员字符串的引用数组,然后该数组的基于范围的-适用于初始化如下:

DEMO

std::ref

添加

正如@HolyBlackCat在评论中建议的那样,这看起来更简单:

DEMO

void setValues(std::string values[])
{        
    std::size_t i = 0;
    for(auto& str : {std::ref(firstName), std::ref(lastName), std::ref(DoB), std::ref(address)}){
        str.get() = std::move(values[i++]);
    }
}

答案 2 :(得分:0)

由于您大概是通过某种getValueOfZ()从用户那里获取输入的,所以一种很好的获取输入的方法是重载插入运算符。

std::istream

您还可以重载提取运算符。