Hier ist eine Version, die die Funktion aus der Überladung entfernt, anstatt eine statische_Ausgabe zu geben. Auf diese Weise können Sie andere Überladungen der Funktion bereitstellen, die verwendet werden könnten, wenn die Typen nicht alle gleich sind, anstatt eine fatale static_assertion, die nicht vermieden werden kann.
#include <type_traits>
template<typename... T>
struct all_same : std::false_type { };
template<>
struct all_same<> : std::true_type { };
template<typename T>
struct all_same<T> : std::true_type { };
template<typename T, typename... Ts>
struct all_same<T, T, Ts...> : all_same<T, Ts...> { };
template<typename... T>
typename std::enable_if<all_same<T...>::value, void>::type
func(T...)
{ }
Wenn Sie perfekte Weiterleitung unterstützen möchten Sie wahrscheinlich wollen die Typen zerfallen, bevor sie zu überprüfen, so dass die Funktion eine Mischung aus L-Wert und rvalue Argumente akzeptieren, solange sie die gleiche Art haben:
template<typename... T>
typename std::enable_if<all_same<typename std::decay<T>::type...>::value, void>::type
func(T&&...)
{ }
Alternativ, wenn Sie einen Allzweck-Merkmal für die logische Verbindung testen Sie es tun können std::is_same
statt das Schreiben eigener all_same
mit:
template<typename T, typename... Ts>
typename std::enable_if<and_<is_same<T, Ts>...>::value, void>::type
func(T&&, Ts&&...)
{ }
Da diese mindestens ein Argument erfordert würden Sie auch eine weitere Überlastung unterstützen müssen die Null Argument Fall: kann
void func() { }
Der and_
Helfer wie so definiert werden:
template<typename...>
struct and_;
template<>
struct and_<>
: public std::true_type
{ };
template<typename B1>
struct and_<B1>
: public B1
{ };
template<typename B1, typename B2>
struct and_<B1, B2>
: public std::conditional<B1::value, B2, B1>::type
{ };
template<typename B1, typename B2, typename B3, typename... Bn>
struct and_<B1, B2, B3, Bn...>
: public std::conditional<B1::value, and_<B2, B3, Bn...>, B1>::type
{ };
Wenn Sie eine variable Anzahl von int-Argumenten benötigen, warum übergeben Sie keinen Vektor? Was werden diese Argumente tun? – Shark
Oh>. <, Das könnte ich wirklich machen. Und ich spiele nur mit variadischen Vorlagen herum. – Skeen
Verwenden Sie nicht "...". Die Ellipse ist eine gefährliche Verschleppung von C. Verwenden Sie stattdessen höhere C++ - Konstrukte und -Bibliotheken. ("C++ Coding Standards", Sutter/Alexandrescu) –