如何解决如何指示容器中的多态函子完成其工作并返回结果?
我有一个 std::vector<>
指向基函数的指针。这个容器,一个计算器类,应该能够容纳任意数量的这些计算任意统计数据的函数对象。
我正在努力解决的部分是如何为容器类编写一个方法,该方法遍历这些指针,从 hte 组中挑选出您感兴趣的那个,并通过调用 {{ 1}},然后返回结果。
下面是一些说明这个想法的代码:
operator()
现在,我怎么能告诉#include <iostream>
#include <memory> //shared_ptr
#include <vector>
class BaseFunctor{
virtual double operator()(std::vector<double> inputs) = 0;
};
class Sum : public BaseFunctor{
double operator() (std::vector<double> inputs){
double sum (0.0);
for(auto elem : inputs)
sum += elem;
return sum;
}
};
class Prod : public BaseFunctor{
double operator() (std::vector<double> inputs){
double sum (1.0);
for(auto elem : inputs)
sum *= elem;
return sum;
}
};
class Calculator {
private:
std::vector<std::shared_ptr<BaseFunctor>> m_stats;
std::vector<double> m_simple_data;
public:
Calculator()
: m_simple_data({1.0,2.0,3.0}) {};
void addStat(std::shared_ptr<BaseFunctor> stat) {
m_stats.push_back(stat);
}
// calculate stat?
};
int main() {
Calculator calc;
calc.addStat(std::make_shared<Sum>());
calc.addStat(std::make_shared<Prod>());
return 0;
}
给我产品,而且只给我产品?尤其是当我无法控制用户最终感兴趣的统计数据时?
我想我可以将指针存储在 calc
中,但这似乎是多余的:使键与类同名。
Here 是一个想法,但它不能编译。
解决方法
这行得通,但我愿意接受评论/批评/建议。
#include <iostream>
#include <memory> //unique_ptr
#include <map>
#include <vector>
#include <string>
#include <functional>
class BaseFunctor{
public:
virtual double operator()(std::vector<double> inputs) = 0;
virtual std::string name() = 0;
};
class Sum : public BaseFunctor{
double operator() (std::vector<double> inputs){
double sum (0.0);
for(auto elem : inputs)
sum += elem;
return sum;
}
std::string name() { return "sum"; }
};
class Prod : public BaseFunctor{
double operator() (std::vector<double> inputs){
double prod (1.0);
for(auto elem : inputs)
prod *= elem;
return prod;
}
std::string name() { return "prod"; }
};
class Calculator {
private:
std::map<std::string,std::unique_ptr<BaseFunctor> > m_stats;
std::vector<double> m_simple_data;
public:
Calculator()
: m_simple_data({1.0,2.0,5.0}) {};
void addStat(std::unique_ptr<BaseFunctor> stat) {
m_stats.insert(
std::pair<std::string,std::unique_ptr<BaseFunctor>>(
stat->name(),std::move(stat)
)
);
//m_stats.push_back(std::move(stat));
}
double calc(std::string op_name){
return (*m_stats[op_name])(m_simple_data);
}
};
int main() {
Calculator thing;
thing.addStat(std::unique_ptr<BaseFunctor>(new Sum()) );
thing.addStat(std::unique_ptr<BaseFunctor>(new Prod()) );
std::cout << "sum: " << thing.calc("sum") << "\n";
std::cout << "prod: " << thing.calc("prod");
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。