Ich muss das Produkt einer Reihe von Zahlen zur Kompilierzeit berechnen, die an eine Vorlagenstruktur übergeben wird. Es gelang mir, eine hässlich Lösung zu machen:Vorlage Metaprogrammierung: Multiplikation einer Reihe von Vorlagenargumenten
template<std::size_t n1, std::size_t ...args>
struct mul_all
{
static constexpr std::size_t value = n1 * mul_all<args...>;
};
template<>
struct mul_all<0>
{
static constexpr std::size_t value = 1;
};
Das Problem ist, dass jedes Mal, wenn ich 0 bis Template args wie so zu meinem struct
int main()
{
std::cout << mul_all<1,2,5,4,5,7,0>::value << " "
<< mul_all<4,2,0>::value;
return 0;
}
einzuspeisen Gibt es eine Problemumgehung, um von der letzten Null gelesen zu bekommen?
Hinweis: Ich bin ein Anfänger in TMP.
Genau, hier ist ein C + +14 'constexpr' Lösung, die keine Template-Rekursion verwendet: http://melpon.org/wandbox/permlink/yNbfyOhiN3hLqmpA – bogdan
cool !!! gibt es irgendeine möglichkeit es mit der anderen lösung zu vergleichen? –
Meinst du in Bezug auf die Kompilierzeit? Die nicht-rekursiven Lösungen sollten ungefähr gleich und besser als die klassischen Template-Rekursionen sein, da die rekursiven Lösungen mehrere Template-Instanziierungen erzeugen, die etwas kosten (in der Praxis beginnt es für relativ viele Template-Argumente von Bedeutung zu sein - viele Dutzende von ihnen). Die C++ 14-Dummy-Array-Lösung ist jedoch nur ein Workaround für das Fehlen von Faltungsausdrücken; Ich würde C++ 17 fache Ausdrücke wann immer verfügbar wählen. – bogdan