2017-06-24 2 views
0

Im Grunde, was ich zu tun versuchteVorlage, für Array auf Länge Verzweigung von Compile-Zeit Initialisiererliste

#include <array> 
#include <initializer_list> 

template <class... Fs> 
auto F(const std::initializer_list<double>& vars, const Fs&... exprs) { 
    return std::array<double, vars.size()>{}; 
} 

Dies ist natürlich nicht kompiliert, da Vars ist keine Kompilierung-Konstante in seiner Länge als bekannt zu Compilern. Die Sache ist, ich kann in der Tat wissen, dass es Länge zur Kompilierungszeit ist, obwohl die Werte nicht bekannt sind. Und das Problem ist, dass, wenn ich die Initialisiererliste als variadic Schablone ausdehne, das zwei variadic Pakete ergeben würde.

Muss ich übergeben explizite Zahl Parameter an die Funktion? Wie erreiche oder approximiere ich die gewünschte Semantik?

EDIT: Ich muss Array nicht zurückgeben, ich muss nur eine Doppelfolge, vorzugsweise auf Stapel zurückgeben.

+0

Ich persönlich sehe dies als ein Fehler von 'constexpr' Funktionen. Sie können versuchen, mit Tupeln weiterzuleiten, macht die Syntax hässlicher obwohl –

+0

'std :: array' ist so gut wie das nächste, was Sie bekommen können, wenn Sie eine Sequenz von Objekten auf dem Stapel zurückgeben. Dies und 'std :: tuple' –

Antwort

1

Wenn Sie die Größe zur Kompilierzeit kennen, warum nicht ein Array fester Größe mit der Länge als Template-Parameter verwenden?

#include <array> 

template < size_t N, class... Fs > 
auto F(const double (&vars)[N], const Fs&... exprs) { 
    return std::array<double, N>{}; 
} 

int main() 
{ 
    auto a = F({ 1, 2, 3, 4 }); 
} 
Verwandte Themen