C
Sone schrieb:
camper schrieb:
Hier eine neue Variante, die weitgehen ohne Rekursion Rekursion auskommt. Selbst der aktuelle Snapshot von g++ 4.8 (01.07.12) kann damit allerdings nicht umgehen, weil constexpr immer noch nicht ausreichend unterstützt wird:
struct Foo {
constexpr Foo() : a(0), b(a) {}
int a, b;
};
Wieso geht nicht so ein kleiner dirty hack?
struct Foo
{
constexpr Foo() {}
int a = 0,
b = 0;
};
Edit: sry, aber die CPP-Tags sind heute ziemlich stinkig.
Das ist nicht dirty, allerdings auch nicht das was ich will. Mir geht es darum, einen rekursiven Ausdruck direkt auszuschreiben, effektiv also in eine iterative Form zu überführen (und dadurch Speicher und Zeit zu sparen, weil weniger (bzw. billigere) Instantierungen durchgeführt werden (siehe oben Zeile 88).
z.B.
template <typename V> struct fib;
template <typename T, T... i> struct fib<value_list<T, i...>>
: tagged_value<0,T>, tagged_value<1,T>, tagged_value<j+2, T>...
{
constexpr partial_sum() : tagged_value<0,T>(0), tagged_value<1,T>(1), tagged_value<j+2, T>( tagged_value<j,T>::v + tagged_value<j+1,T>::v )... {}
};
Ohne constexpr funktioniert das problemlos, das Objekt kann dann aber eben nicht in einem konstanten Ausdruck verwendet werden.
Eigentlich sollte das auch mit Arrays funktionieren
constexpr int fib[] = { 0, 1, fib[0]+fib[1], fib[1]+fib[2] /* usw. per packexpansion */ };
Allerdings macht hier nicht einmal clang mit (wiederum: lässt man constexpr weg, gibt es keine Probleme)