fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5.  
  6. //================================================================
  7.  
  8. #define SumValuesFrom(container, member) priv_XValuesFrom_normal(container, member, [](const decltype(container.front().member) &valueA, const decltype(container.front().member) &valueB) { return (valueA + valueB); })
  9. #define SumValuesFromPtr(container, member) priv_XValuesFrom_ptr(container, member, [](const decltype(container.front()->member) &valueA, const decltype(container.front()->member) &valueB) { return (valueA + valueB); })
  10.  
  11. #define priv_XValuesFrom_normal(container, member, addingFunctor) priv_XValuesFrom<decltype(container.front().member)>(container, [](const decltype(container)::value_type &element) { return element.member; }, addingFunctor)
  12. #define priv_XValuesFrom_ptr(container, member, addingFunctor) priv_XValuesFrom<decltype(container.front().member)>(container, [](const decltype(container)::value_type &element) { return element->member; }, addingFunctor)
  13.  
  14. template<typename ValueType, typename ContainerType, typename ReadingFunctor, typename AddingFunctor>
  15. ValueType priv_XValuesFrom(const ContainerType &container, ReadingFunctor getValue, AddingFunctor addValues, ValueType initialValue = ValueType())
  16. {
  17. ValueType total = initialValue;
  18.  
  19. for(const auto &element : container)
  20. {
  21. total = addValues(total, getValue(element));
  22. }
  23.  
  24. return total;
  25. }
  26.  
  27. //================================================================
  28.  
  29. struct MyStruct
  30. {
  31. MyStruct(int value) : memberVariable(value) { }
  32.  
  33. std::string otherData = "";
  34. int memberVariable = 1;
  35. };
  36.  
  37. int main()
  38. {
  39. std::vector<MyStruct> myContainer = {{1},{2},{3},{4}};
  40.  
  41. //Sum and display the values of *a member variable* within each element of a container.
  42. std::cout << "Total is: " << SumValuesFrom(myContainer, memberVariable) << std::endl;
  43.  
  44. return 0;
  45. }
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
Total is: 10