In Python können wir dies tun:Ist es möglich, in C++ eine templated, Single-Parameter-Summenfunktion zu haben?
int_list = [1, 2, 3, 4, 5]
print(sum(int_list)) # prints 15
float_tuple = (1.2, 3.4, 9.9)
print(sum(float_tuple)) # prints 14.5
Die sum
Funktion nimmt jede iterable von Elementen, die wissen, wie man miteinander und mit 0 und erzeugt die Summe hinzugefügt werden.
Ich wollte eine identische Funktion in C++ 11 machen. Ich bin mir bewusst, dass es die accumulate
Methode gibt, aber ich möchte eine Funktion, die einen einzelnen Parameter akzeptiert. Im Grunde möchte ich wissen, wie die folgende Code Kompilierung zu machen:
#include <string>
#include <iostream>
#include <vector>
#include <deque>
#include <list>
template<typename iterable>
auto sum(iterable iterable_) {
auto it = iterable_.begin();
auto end = iterable_.end();
if (it == end) {
return 0;
}
auto res = *(it++);
while (it != end) {
res += *it++;
}
return res;
}
int main() {
std::vector<int> int_vector = {0, 1, 2, 3, 4, 5};
std::cout << sum(int_vector) << '\n'; // prints 15
std::deque<int> int_deque = {4, 5, 7};
std::cout << sum(int_deque) << '\n'; // prints 16
std::list<float> float_list = {1.2, 3.4, 9.9};
std::cout << sum(float_list) << '\n'; // should print 14.5, but produces error.
}
Dieser Code fast funktioniert. Das Problem ist, dass auto
die return 0;
in dem Fall sieht, dass das iterable leer ist und es annimmt, dass die Funktion int
zurückgeben muss. Dann sieht es, dass die float
Version eine float
zurückgibt und es wird verwirrt. Gibt es eine Möglichkeit, den Compiler zu sagen, sagen return float(0)
, wenn es sieht, dass die return
später zurück float
?
Ersetzen Sie 'return 0' durch' return {} '? –
Neben: 'sum' nimmt eine * Kopie * nach Wert des iterablen statt eine Referenz darauf. – kfsone
@kfsone, war mir nicht bewusst. Ich dachte, Python-Objekte (zumindest in CPython) wurden als PyObject * übergeben? Du meinst, dass die gesamte Liste für die Summenfunktion in den Speicher kopiert wird? Das scheint schrecklich ineffizient zu sein. –