#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;
}