C++ 删除变量分配的重复行

C++ 删除变量分配的重复行,c++,C++,我目前正在做一个项目,在一个类中,我将从用户输入中获取大量变量。有没有办法阻止这样的事情: class Person { std::string firstName, lastName, DoB, address; int personID, durationMins, totalVisits; void setValues(std::string

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

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
}
};

我希望避免有大量的行专门用于变量赋值,尽管我不知道这是否可行。任何帮助都将不胜感激,谢谢

由于您可能是通过某种
std::istream
从用户处获取输入,因此获取输入的一种优雅方式是重载插入运算符

class Person {
     /* ... */
     friend std::istream& operator>>(std::istream& stream, Person& p) {
        stream >> p.firstName >> p.lastName >> p.DOB;

        /* might not be very straightforward to input address as you need to take care of spaces */
        /* put address processing logic here */
        std::getline(stream, p.address);
        return stream;
     }
};

int main () {
   Person person;
   std::cin >> person;
   return 0;
}

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

在C++11及以上版本中,您可以使用
std::reference\u wrapper
或助手函数
std::ref
生成成员字符串的引用数组,然后此数组基于的范围适用于初始化,如下所示:

class Person {
     /* ... */
     friend std::istream& operator>>(std::istream& stream, Person& p) {
        stream >> p.firstName >> p.lastName >> p.DOB;

        /* might not be very straightforward to input address as you need to take care of spaces */
        /* put address processing logic here */
        std::getline(stream, p.address);
        return stream;
     }
};

int main () {
   Person person;
   std::cin >> person;
   return 0;
}


添加

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


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

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);
}
template void AssignArrayElementsTo(常量T*数组,P&…对象)
{
标准:尺寸i=0;
((objects=array[i++]),…);
}
// ...
void setValues(标准::字符串值[])
{
AssignArrayElementsTo(值、名字、姓氏、出生日期、地址);
}

<>遗憾的是C++没有反射(所以),所以你仍然需要手动列出所有需要的类成员。这是没有办法的。

研究循环。@JesperJuhl据我所知,你不能做一个分配完全不同变量的循环吗?循环在这里没有帮助,这是我试图处理的问题。我不知道这样做。您可以避免多行作业。请参见以下内容:如何使用领带执行此操作:。请参见如何将数组转换为tie:。您仍然必须声明所有这些变量。您可以创建一个循环,将数据读入容器的后续元素(如
std::vector
)。您应该尝试重载流运算符。您希望
stream>>…>>p、 地址
要工作吗<代码>地址可能包含空格。这是一个例子,不应该是替代品。用户需要添加更多代码以获取包含空格的输入(用于获取要传递给
setValues
的地址的任何逻辑都可以放入
>
重载中)。我们要说明的一点是,如果输入是从用户处获取的,那么可以通过重载
>
操作符来获取所有输入。我对答案进行了编辑,以明确答案。或者,您可以使用指针:
auto*str:{&firstName,&lastName,…}
。要输入的字符少了一点。
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);
}