我目前正在做一个项目,在一个班上,我将从用户输入中吸收大量变量。有没有办法阻止这样的事情:
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
}
};
我想避免有大量专用于变量分配的行,尽管我不知道这是否可能。任何帮助,将不胜感激,谢谢。
答案 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
生成成员字符串的引用数组,然后该数组的基于范围的-适用于初始化如下:
std::ref
添加
正如@HolyBlackCat在评论中建议的那样,这看起来更简单:
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
您还可以重载提取运算符。