#include <iostream>
#include <memory> //shared_ptr
#include <map>
#include <vector>
#include <string>
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:
using FPtr = std::shared_ptr<BaseFunctor>;
std::map<std::string, FPtr> m_stats;
std::vector<double> m_simple_data;
public:
Calculator()
: m_simple_data({1.0, 2.0, 3.0}) {};
void addStat(FPtr stat) {
m_stats.insert(std::pair<std::string, FPtr>(stat->name(), stat) );
}
double calc( std::string op_name){
return m_stats[op_name](m_simple_data);
}
};
int main() {
Calculator thing;
thing.addStat(std::make_shared<Sum>());
thing.addStat(std::make_shared<Prod>());
std::vector<double> args {1.0, 2.0, 3.0};
thing.calc("sum")
return 0;
}