2010-06-01 10 views
7

Gibt es ein Makro, das mir sagt, ob mein Compiler variadische Vorlagen unterstützt?Wie kompiliere ich variadic Vorlagen bedingt?

Wenn sie nicht unterstützt werden, würde ich sie mit einer Reihe von Überlastungen simulieren. Irgendwelche besseren Ideen? Vielleicht gibt es Präprozessor-Bibliotheken, die den Job erleichtern können?

Antwort

7

Es sieht aus wie die aktuelle Version von Boost-BOOST_NO_VARIADIC_TEMPLATES definiert wenn variadische Vorlagen nicht verfügbar sind. Dies wird von boost/config.hpp bereitgestellt; siehe here für die Dokumentation zu config.hpp.

Wenn Variant-Vorlagen nicht verfügbar sind, dann müssen Sie sie wahrscheinlich mit einer Reihe von Überladungen simulieren, wie Sie gesagt haben. Die Boost.Preprocessor Bibliothek kann hier helfen; Es wurde entwickelt, um alle Arten von sich wiederholendem Quellcode zu automatisieren, einschließlich Überladungen von Vorlagen. Sie können die Boost-Quellbäume für BOOST_NO_VARIADIC_TEMPLATES nach Beispielen durchsuchen, um sie zu verwenden, um variadische Vorlagen zu simulieren.

+1

Ich würde Ihren Ansatz mit Niels 'kombinieren: schlagen Sie eine Schnittstelle mit vielen Überladungen von verschiedenen Aritäten vor dank Boost.Preprocessor, der die Parameter in einen' Boost.Fusion'-Container (Tupel, Vektor, etc ...) umschließt dann an eine einzelne Vorlagenklasse weitergegeben, in der erwartet wird, dass die eigentliche Implementierung durchgeführt wird. Die Idee ist einfach, die Menge an Code in den Makros zu reduzieren, um das Debuggen zu erleichtern :) –

8

Vielleicht: #ifndef BOOST_NO_VARIADIC_TEMPLATES?


Wenn variadische Vorlagen nicht unterstützt werden, könnte man denken, die Boost-Tupel Bibliothek verwenden:

template<typename Tuple> void coolstuff(Tuple&& args); 

Und:

coolstuff(boost::make_tuple(1, 2, 3));