template <typename T> T calculateSum(T a) {
return a;
}
template <typename T> T calculateSum(T a, T b) {
return a + b;
}
template <typename T, typename... Targs> T calculateSum(T first, Targs... rest) {
return calculateSum(first, calculateSum(rest...));
}
template <typename T> size_t calculateCount(T a) {
return 1;
}
template <typename T> size_t calculateCount(T a, T b) {
return 2;
}
template <typename T, typename... Targs> size_t calculateCount(T first, Targs... rest) {
return 1 + calculateCount(rest...);
}
template <typename T, typename... Targs> double calculateAverage(T first, Targs... rest) {
size_t n = calculateCount(first, rest...);
T s = calculateSum(first, rest...);
return double(s) / n;
}
void setup() {
int sum;
double avg;
Serial.begin(115200); Serial.println();
Serial.println(F("-------------------"));
Serial.print(F("sum: ")); Serial.println(calculateSum(1));
Serial.print(F("sum: ")); Serial.println(calculateSum(1, 2));
Serial.print(F("sum: ")); Serial.println(calculateSum(1, 2, 3));
Serial.print(F("sum: ")); Serial.println(calculateSum(1, 2, 3, 4));
Serial.println(F("-------------------"));
Serial.print(F("average: ")); Serial.println(calculateAverage(1, 2, 3));
Serial.print(F("average: ")); Serial.println(calculateAverage(1, 2, 3, 4));
}
void loop() {}