想象一下这样一个阶级人:
class Person {
public:
double height;
double weight;
};我有一个包含该类实例的向量:
std::vector<Person> crowd;现在我要计算平均身高和体重,所以我要:
double mean_height = 0, mean_weight = 0;
for (int i=0; i<crowd.size(); i++) {
mean_height += crowd[i].height;
mean_weight += crowd[i].weight;
}
mean_height /= crowd.size();
mean_weight /= crowd.size();由于我在代码中经常使用平均操作,所以我希望能够编写一个函数,其功能如下:
mean_height = crowd_mean(crowd, height);其中,参数“高度”(不管是什么类型)指定我要对向量中的所有实例执行所有“高度”成员的平均值。有什么简单的方法吗?
发布于 2020-01-15 15:42:35
您可以使用指向类成员的指针来完成此操作。看起来就像
double crowd_mean(const std::vector<Person>& crowd, double Person::*member)
{
double mean = 0;
for (const auto& elem : crowd)
mean += elem.*member;
return mean / crowd.size();
}
int main()
{
std::vector<Person> foo(10);
auto result = crowd_mean(foo, &Person::weight);
}如果您想使它更通用,那么您可以将该函数设置为类似的函数模板
template <typename T>
double crowd_mean(const std::vector<T>& crowd, double T::*member)
{
double mean = 0;
for (const auto& elem : crowd)
mean += elem.*member;
return mean / crowd.size();
}发布于 2020-01-15 15:43:03
有什么简单的方法吗?
是!
你想要一个指针对成员.
你像&Person::height一样传递它,像double Person::*member一样对待它,并像使用obj.*member一样使用它。
示例:
#include <vector>
class Person {
public:
double height;
double weight;
};
double crowd_mean(const std::vector<Person>& crowd, double Person::*member)
{
double result = 0;
for (std::size_t i=0; i<crowd.size(); i++) {
result += crowd[i].*member;
}
result /= crowd.size();
return result;
}
int main()
{
std::vector<Person> crowd;
const double mean_height = crowd_mean(crowd, &Person::height);
const double mean_weight = crowd_mean(crowd, &Person::weight);
}(现场演示)
https://stackoverflow.com/questions/59754746
复制相似问题