Betrachten wir die folgenden Funktionen (Es nutzt die CSV parser library from ben-strasser (github))Wie schreibe ich eine Variable-Template-Funktion mit Objekten als Parameter?
void col1(const std::string &fn, Base *v0)
{
io::CSVReader<2> in(fn);
in.read_header(io::ignore_extra_column, "epoch", v0->column);
double ign;
while (in.read_row(ign, v0->value)) {
v0->process();
}
}
void col2(const std::string &fn, Base *v0, Base *v1)
{
io::CSVReader<3> in(fn);
in.read_header(io::ignore_extra_column, "epoch", v0->column, v1->column);
double ign;
while (in.read_row(ign, v0->value, v1->value)) {
v0->process();
v1->process();
}
}
Diese Funktion verarbeitet den Wert in Spalte 2 aus einer CSV-Datei. v0
des Typs Base *
enthält das Element value
, das von read_row
gefüllt wird und in der process
-Methode verarbeitet wird. Base
ist eine Interface-Klasse von Berechnungsmethoden (zum Beispiel: eine ist Max, eine andere ist MinMaxAvg).
Wie könnte ich diese Funktion umschreiben, um eine beliebige Anzahl von Base *
Argumente zu akzeptieren, um mehrere Spalten zu verarbeiten?
read_header
und read_row
sind variadic-template-Funktion und können somit eine beliebige Anzahl von Argumenten akzeptieren, aber sie funktionieren nur mit Skalaren.
Wie erweitere/entpacke ich das variadic-Argument, so dass es ein Mitglied aufruft oder benutzt?
ich einige Dinge ausprobiert, einige Beispiele zu lesen, aber ich bin nicht in der Lage, etwas zu schaffen, das hier funktioniert, ist, mein Strom/ridicules Code:
template<unsigned int COL>
void func(const std::string &fn, Base &... values)
{
io::CSVReader<COL> in(fn);
// that's it :-(
}
@OP: Sollte jeder 'Base' von der Variadic-Packung sei p wie in Ihrem ersten Snippet wie "v0", aber mit einer eigenen Spalte in der Reihenfolge? – Quentin
@Quentin Ja, ich füge meine aktuelle Version von Col2 hinzu. –
Sie wechseln von Zeigern (Base *) zu Referenzen (Base &) - beabsichtigt? – Aconcagua