Angenommen, ich habe eine Funktion, um zu bestimmen, die wie folgt aussieht:Way richtige Prädikat für Templat-Typen
template <class In, class In2>
void func(In first, In last, In2 first2);
ich diese Funktion möchte eine andere Funktion aufrufen, die ein Prädikat akzeptiert.
template <class In, class In2>
void func(In first, In last, In2 first2) {
typedef typename std::iterator_traits<In>::value_type T;
other_func(first, last, first2, std::less<T>());
}
Aber es gibt ein Problem, was passiert, wenn In
und In2
sind Iteratoren auf verschiedene Arten: Mein erster Instinkt, so etwas zu tun war? Zum Beispiel char*
vs int*
. Abhängig davon, welches In
ist und welches In2
ist, kann das Prädikat Werte während seines Vergleichs abschneiden. Zum Beispiel, wenn In
ist char*
dann wird std::less<char>
auch genannt werden, wenn In2
ein int*
ist.
Wenn ::operator<
zwei Parameter angegeben wird, ist der Compiler in der Lage die richtige Art und die Standardtyp Förderung Regeln gelten abzuleiten. Wenn Sie jedoch ein Prädikat auswählen, das an eine Funktion übergeben werden soll, besteht keine Möglichkeit, dass dies geschieht. Gibt es eine kluge Art und Weise, um herauszufinden, welche Version von std::less<>
ich auf In
passieren will basierte und In2
?
EDIT:
Das folgende Beispiel veranschaulicht das Problem:
unsigned int x = 0x80000000;
unsigned char y = 1;
std::cout << std::less<unsigned char>()(x, y) << std::endl;
std::cout << std::less<unsigned int>()(x, y) << std::endl;
AUSGABE:
1
0
EDIT:
Nachdem darüber nachzudenken, was würde Ich mag in der Lage sein, so etwas zu tun:
typedef typeof(T1() < T2()) T;
other_func(first, last, first2, std::less<T>());
Ich glaube, ich __typeof__
Erweiterung des gcc verwenden könnte ..., aber ich weiß nicht, dass die Idee entweder lieben. Gibt es eine Möglichkeit, diesen Nettoeffekt standardkonform zu erhalten?
ja, bisher scheint eine inhomogene weniger Vorlage die Lösung zu sein. In der Tat frage ich mich, warum 'std :: less' (oder alle binary_function-Komparatoren) nicht gemacht werden, um 2 Template-Parameter zu nehmen. Scheint, dass dies die einzige Möglichkeit ist, 'std :: less' in allen Situationen wie 'operator