#include <iostream>
#include <vector>
#include <string>
using namespace std;
//================================================================
#define SumValuesFrom(container, member) priv_XValuesFrom_normal(container, member, [](const decltype(container.front().member) &valueA, const decltype(container.front().member) &valueB) { return (valueA + valueB); })
#define SumValuesFromPtr(container, member) priv_XValuesFrom_ptr(container, member, [](const decltype(container.front()->member) &valueA, const decltype(container.front()->member) &valueB) { return (valueA + valueB); })
#define priv_XValuesFrom_normal(container, member, addingFunctor) priv_XValuesFrom<decltype(container.front().member)>(container, [](const decltype(container)::value_type &element) { return element.member; }, addingFunctor)
#define priv_XValuesFrom_ptr(container, member, addingFunctor) priv_XValuesFrom<decltype(container.front().member)>(container, [](const decltype(container)::value_type &element) { return element->member; }, addingFunctor)
template<typename ValueType, typename ContainerType, typename ReadingFunctor, typename AddingFunctor>
ValueType priv_XValuesFrom(const ContainerType &container, ReadingFunctor getValue, AddingFunctor addValues, ValueType initialValue = ValueType())
{
ValueType total = initialValue;
for(const auto &element : container)
{
total = addValues(total, getValue(element));
}
return total;
}
//================================================================
struct MyStruct
{
MyStruct(int value) : memberVariable(value) { }
std::string otherData = "";
int memberVariable = 1;
};
int main()
{
std::vector<MyStruct> myContainer = {{1},{2},{3},{4}};
//Sum and display the values of *a member variable* within each element of a container.
std::cout << "Total is: " << SumValuesFrom(myContainer, memberVariable) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojZGVmaW5lIFN1bVZhbHVlc0Zyb20oY29udGFpbmVyLCBtZW1iZXIpIHByaXZfWFZhbHVlc0Zyb21fbm9ybWFsKGNvbnRhaW5lciwgbWVtYmVyLCBbXShjb25zdCBkZWNsdHlwZShjb250YWluZXIuZnJvbnQoKS5tZW1iZXIpICZ2YWx1ZUEsIGNvbnN0IGRlY2x0eXBlKGNvbnRhaW5lci5mcm9udCgpLm1lbWJlcikgJnZhbHVlQikgeyByZXR1cm4gKHZhbHVlQSArIHZhbHVlQik7IH0pCiNkZWZpbmUgU3VtVmFsdWVzRnJvbVB0cihjb250YWluZXIsIG1lbWJlcikgcHJpdl9YVmFsdWVzRnJvbV9wdHIoY29udGFpbmVyLCBtZW1iZXIsIFtdKGNvbnN0IGRlY2x0eXBlKGNvbnRhaW5lci5mcm9udCgpLT5tZW1iZXIpICZ2YWx1ZUEsIGNvbnN0IGRlY2x0eXBlKGNvbnRhaW5lci5mcm9udCgpLT5tZW1iZXIpICZ2YWx1ZUIpIHsgcmV0dXJuICh2YWx1ZUEgKyB2YWx1ZUIpOyB9KQoKI2RlZmluZSBwcml2X1hWYWx1ZXNGcm9tX25vcm1hbChjb250YWluZXIsIG1lbWJlciwgYWRkaW5nRnVuY3RvcikgcHJpdl9YVmFsdWVzRnJvbTxkZWNsdHlwZShjb250YWluZXIuZnJvbnQoKS5tZW1iZXIpPihjb250YWluZXIsIFtdKGNvbnN0IGRlY2x0eXBlKGNvbnRhaW5lcik6OnZhbHVlX3R5cGUgJmVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQubWVtYmVyOyB9LCBhZGRpbmdGdW5jdG9yKQojZGVmaW5lIHByaXZfWFZhbHVlc0Zyb21fcHRyKGNvbnRhaW5lciwgbWVtYmVyLCBhZGRpbmdGdW5jdG9yKSAgICBwcml2X1hWYWx1ZXNGcm9tPGRlY2x0eXBlKGNvbnRhaW5lci5mcm9udCgpLm1lbWJlcik+KGNvbnRhaW5lciwgW10oY29uc3QgZGVjbHR5cGUoY29udGFpbmVyKTo6dmFsdWVfdHlwZSAmZWxlbWVudCkgeyByZXR1cm4gZWxlbWVudC0+bWVtYmVyOyB9LCBhZGRpbmdGdW5jdG9yKQoKdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlLCB0eXBlbmFtZSBDb250YWluZXJUeXBlLCB0eXBlbmFtZSBSZWFkaW5nRnVuY3RvciwgdHlwZW5hbWUgQWRkaW5nRnVuY3Rvcj4KVmFsdWVUeXBlIHByaXZfWFZhbHVlc0Zyb20oY29uc3QgQ29udGFpbmVyVHlwZSAmY29udGFpbmVyLCBSZWFkaW5nRnVuY3RvciBnZXRWYWx1ZSwgQWRkaW5nRnVuY3RvciBhZGRWYWx1ZXMsIFZhbHVlVHlwZSBpbml0aWFsVmFsdWUgPSBWYWx1ZVR5cGUoKSkKewoJVmFsdWVUeXBlIHRvdGFsID0gaW5pdGlhbFZhbHVlOwoKCWZvcihjb25zdCBhdXRvICZlbGVtZW50IDogY29udGFpbmVyKQoJewoJCXRvdGFsID0gYWRkVmFsdWVzKHRvdGFsLCBnZXRWYWx1ZShlbGVtZW50KSk7Cgl9CgoJcmV0dXJuIHRvdGFsOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBNeVN0cnVjdAp7CglNeVN0cnVjdChpbnQgdmFsdWUpIDogbWVtYmVyVmFyaWFibGUodmFsdWUpIHsgfQoJCglzdGQ6OnN0cmluZyBvdGhlckRhdGEgPSAiIjsKCWludCBtZW1iZXJWYXJpYWJsZSA9IDE7Cn07CgppbnQgbWFpbigpCnsKCXN0ZDo6dmVjdG9yPE15U3RydWN0PiBteUNvbnRhaW5lciA9IHt7MX0sezJ9LHszfSx7NH19OwoJCgkvL1N1bSBhbmQgZGlzcGxheSB0aGUgdmFsdWVzIG9mICphIG1lbWJlciB2YXJpYWJsZSogd2l0aGluIGVhY2ggZWxlbWVudCBvZiBhIGNvbnRhaW5lci4KCXN0ZDo6Y291dCA8PCAiVG90YWwgaXM6ICIgPDwgU3VtVmFsdWVzRnJvbShteUNvbnRhaW5lciwgbWVtYmVyVmFyaWFibGUpIDw8IHN0ZDo6ZW5kbDsKCQoJcmV0dXJuIDA7Cn0=