Digamos que eu tenha um banco de dados simples (POD) struct
contendo vários campos numéricos.
Quero sobrecarregar os operadores de comparação para poder comparar duas instâncias do meu POD.
O problema é que preciso de uma sobrecarga para esses operadores - digamos, operador less()
- para cada um dos campos numéricos no POD.
Obviamente, o abaixo não funciona porque o compilador não tem como distinguir as duas versões:
struct my_struct{
int a;
int b;
int c;
};
bool operator<(const my_struct& one, const my_struct& two) {
return one.a < two.a;
}
bool operator<(const my_struct& one, const my_struct& two) {
return one.b < two.b;
}
Então escrevi minha própria função personalizada lessThan()
, que aceita um sinalizador e faz o trabalho, mas não gosto particularmente dessa solução (no MWE abaixo), pois não posso usá-la <
como faria facilmente com um operador de comparação.
#include <iostream>
#include <iomanip>
struct my_struct{
int a;
int b;
int c;
};
bool lessThan(const my_struct& one, const my_struct& two, const char flag) {
switch (flag) {
case 'a':
return one.a < two.a;
break;
case 'b':
return one.b < two.b;
break;
case 'c':
return one.c < two.c;
break;
default:
throw("Either case a, b, or c\n");
break;
}
}
int main()
{
my_struct one{1, 3, 4};
my_struct two{2, 2, 4};
std::cout << "one < two: " << std::boolalpha
<< lessThan(one, two, 'a') << std::endl;
return 0;
}
Existe uma maneira de criar múltiplas sobrecargas de operadores de comparação para PODs personalizados struct
com muitos campos numéricos, com cada sobrecarga comparando um desses campos?
(Para lhe dar mais contexto, preciso dessas sobrecargas para classificar uma matriz de arquivos de acordo com qualquer uma de suas características: como por dimensão, por data da última modificação, por número de arquivos contidos ou subdiretórios, etc.
No exemplo simplificado acima, cada instância POD abstrai um arquivo.)
EDITAR:
Esboço do uso pretendido:
sortAccordingToFieldA(std::vector<my_struct>& my_vec, int a){
for (auto i : my_vec) {
for (auto j : [std::find(my_vec.begin(), my_vec.end(), i)+1, my_vec.end()] ) {
if (i < j) // here '<' is overloaded according to field 'a'
// sorting operations
}
}
}