Funktor-Problem

Technipion

Erfahrenes Mitglied
Hey Leute,
ich bin's mal wieder :eek:

Ich bin gerade dabei ein Grundgerüst für evolutionäre Programmierung zu erstellen und habe ein Problem bei meinen Funktoren -.-

Mein Code sah so aus:
C++:
//üblicher Headerkram
#include <functional> //header for std::function

template<typename var>
std::function<var(var)> times_op(var factor){
    return [factor](var x){ return x*factor; };
}
std::function<float(float)> *times;

/* Zeugs */

int main(int argc, char *argv[])
{
    using namespace std;
    /* noch mehr Gedöns */
    times = new function<float(float)> [2];
    times[0] = times_op(2.0f);
    times[1] = times_op(3.0f);
    cout << times[0](3) << endl;
    cout << times[1](3) << endl;
    times[1] = times_op(4.0f);
    cout << times[1](3) << endl;
}

Damit habe ich getestet, wie man ein Array von Funktionen erstellt. Später braucht jede "Spezies" ein eigenes Array von verknüpften Funktionen...
Die Funktion times_op benutzt ein Template, da ich den Typ vorher noch nicht genau kenne (könnte int, float oder auch long double sein).
Also wollte ich für mein Array auch ein Template benutzen, da ja jede Einzelfunktion des Arrays zwar den gleichen Typ benutzen wird, aber halt noch nicht feststeht welcher das sein soll.
Also habe ich auch hier ein Template benutzen wollen:

C++:
//üblicher Headerkram
#include <functional> //header for std::function

template<typename var>
std::function<var(var)> times_op(var factor){
    return [factor](var x){ return x*factor; };
}
template<typename var>
std::function<var(var)> *times;

/* Zeugs */

int main(int argc, char *argv[])
{
    using namespace std;
    /* noch mehr Gedöns */
    times = new function<float(float)> [2];
    times[0] = times_op(2.0f);
    times[1] = times_op(3.0f);
    cout << times[0](3) << endl;
    cout << times[1](3) << endl;
    times[1] = times_op(4.0f);
    cout << times[1](3) << endl;
}

Jetzt Spuckt mir das blöde Teil aber eine Fehlermeldung aus:
>>Fehler: Templatedeklaration von std::function<var(var)>* times<<

Ehrlichgesagt war mir intuitive schon klar, dass das nicht funktionieren kann. Aber wieso nicht?! Kann der die Typen der Arrayelemente nicht einfach zur Laufzeit bestimmen?

Danke schonmal im Voraus.
C++11 ist schon etwas Tolles, aber jede Erweiterung bringt nunmal neue Fehlerquellen mit sich...

Gruß Technipion

PS: Falls ihr wisst wie man ein Array von Funktionen mit unbekannten Typen zur Laufzeit anlegt, könnt ihr das gerne posten! ;)
 
Zuletzt bearbeitet von einem Moderator:
Hi.

Man kann keine Variable als Template deklarieren.

(Was sollte das denn bedeuten, wie sollte man das Template denn instanziieren? Hat man dann x (vom Typ) verschiedene Variablen namens times?)

Wenn du die Variable wirklich global definieren willst, dann mußt du dich auch direkt an der Stelle für einen konkreten Typ entscheiden.

Innerhalb von main kannst du natürlich auto benutzen:
C++:
auto times = new function<float(float)> [2];

Ansonsten hört es sich so an, als ob du später eine (Unterklasser der) Klasse species hast, welche jedes ein Array erhält. Das wäre dann wieder ein Typ und du könntest wiederum ein Template definieren, a la:
C++:
template <typename T>
class species {
  std::function<T(T)>* times;
...
};
 
Als Ergänzung noch:

Kann der die Typen der Arrayelemente nicht einfach zur Laufzeit bestimmen?

Nein, das Konzept "Typ" überlebt den Compilierschritt nicht (im Gegensatz zu vielen verwalteten Sprachen), die Laufzeit kennt keine Typen. Alles was von Typen zu Laufzeit noch übrig ist (RTTI) ist in C++ relativ wenig. Der Standard schreibt folgendes vor:
Eine std::type_info-Struktur muss verfügbar sein (erreichbar mit typeid(T)) welche den Namen beinhält und sonst nur noch Vergleiche mit anderen std::type_info (gleich oder nicht) erlauben muss. Mehr gibt es nicht.
 
Maaaaaaaaan bin ich mal wieder blöd!

Danke für die Antworten, jetzt wo ihr es sagt isses ja eigentlich logisch... ;)

Ich habe den Pointer jetzt einfach nur in meine Klasse gepackt (die schon darauf vorbereitet war mit dem entsprechenden template... *räusper*) und schon läufts.

Wieder mal etwas zu Testzwecken umständlicher gemacht sage ich nur...

Ach Leute, wenn wir euch nicht hätten :D

Vielen Dank
Gruß Technipion
 

Neue Beiträge

Zurück