templated Supposons que j'ai une fonction qui ressemble à ceci:façon de déterminer prédicat approprié pour les types
template <class In, class In2>
void func(In first, In last, In2 first2);
Je voudrais cette fonction pour appeler une autre fonction qui accepte un prédicat. Mon instinct initial était de faire quelque chose comme ceci:
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>());
}
Mais il y a un problème, si In
et In2
sont itérateurs à différents types? Par exemple, char*
par rapport à int*
. Selon ce qui est In
et In2
, le prédicat peut tronquer des valeurs lors de sa comparaison. Par exemple, si In
est char*
, alors std::less<char>
sera appelé même si In2
est int*
.
Lorsque ::operator<
reçoit deux paramètres, le compilateur peut déduire le type correct et les règles de promotion de type standard s'appliquent. Cependant, lors de la sélection d'un prédicat à passer à une fonction, il n'y a aucune possibilité de le faire. Y at-il un moyen intelligent de comprendre quelle version de std::less<>
je veux passer en fonction de In
et In2
?
EDIT:
L'exemple suivant illustre le problème:
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;
Affichera:
1
0
EDIT:
Après avoir réfléchi à ce sujet, ce que je voudrais vraiment est d'être capable de faire quelque chose comme ceci:
typedef typeof(T1() < T2()) T;
other_func(first, last, first2, std::less<T>());
Je suppose que je pourrais utiliser __typeof__
extension gcc ..., mais je n'aime pas cette idée non plus. Un moyen d'obtenir cet effet net d'une manière conforme conforme?
oui, jusqu'à présent, un modèle moins homogène semble être la solution. En fait, je me demande pourquoi 'std :: less' (ou tous les comparateurs de fonctions binaires) ne sont pas faits pour prendre 2 paramètres de modèle. On dirait que c'est la seule façon de faire que 'std :: less' se comporte comme un opérateur