• Source
    1. #include <iostream>
    2. #include <memory> //shared_ptr
    3. #include <map>
    4. #include <vector>
    5. #include <string>
    6.  
    7. class BaseFunctor{
    8. public:
    9. virtual double operator()(std::vector<double> inputs) = 0;
    10. virtual std::string name() = 0;
    11. };
    12.  
    13. class Sum : public BaseFunctor{
    14. double operator() (std::vector<double> inputs){
    15. double sum (0.0);
    16. for(auto elem : inputs)
    17. sum += elem;
    18. return sum;
    19. }
    20. std::string name() { return "sum"; }
    21. };
    22.  
    23. class Prod : public BaseFunctor{
    24. double operator() (std::vector<double> inputs){
    25. double prod (1.0);
    26. for(auto elem : inputs)
    27. prod *= elem;
    28. return prod;
    29. }
    30. std::string name() { return "prod"; }
    31. };
    32.  
    33. class Calculator {
    34. private:
    35. using FPtr = std::shared_ptr<BaseFunctor>;
    36. std::map<std::string, FPtr> m_stats;
    37. std::vector<double> m_simple_data;
    38. public:
    39. Calculator()
    40. : m_simple_data({1.0, 2.0, 3.0}) {};
    41.  
    42. void addStat(FPtr stat) {
    43. m_stats.insert(std::pair<std::string, FPtr>(stat->name(), stat) );
    44. }
    45.  
    46. double calc( std::string op_name){
    47. return m_stats[op_name](m_simple_data);
    48. }
    49. };
    50.  
    51. int main() {
    52.  
    53. Calculator thing;
    54. thing.addStat(std::make_shared<Sum>());
    55. thing.addStat(std::make_shared<Prod>());
    56.  
    57. std::vector<double> args {1.0, 2.0, 3.0};
    58. thing.calc("sum")
    59.  
    60. return 0;
    61. }