Non è possibile una soluzione correlata a operator==
. È possibile generare il codice correlato da una tabella di definizione con l'aiuto del cosiddetto numero X-Macro. La tabella potrebbe assomigliare
#define MEMBER_TBL \
/*type ,name ,default*/ \
X(int ,_(i) ,42 ) \
X(float ,_(f) ,3.14 ) \
X(std::string , t ,"Hello") \
La roba _()
è necessaria per evitare un finale ,
sulla generazione della chiamata std::tie()
. Assicurati che l'ultimo elemento sia w.o. _()
. L'utilizzo per generare i soci è:
struct Foo
{
#define _(x) x
#define X(type, name, default) type name{default};
MEMBER_TBL
#undef X
#undef _
}
Questo genera:
struct Foo
{
int i{42}; float f{3.14}; std::string t{"Hello"};
}
Per generare il operator==
è possibile utilizzare:
bool operator==(Foo const& other) const {
return std::tie(
#define _(x) x,
#define X(type, name, default) this->name
MEMBER_TBL
#undef X
) == std::tie(
#define X(type, name, default) other.name
MEMBER_TBL
#undef X
#undef _
);
}
che si traduce in
bool operator==(Foo const& other) const {
return std::tie(
this->i, this->f, this->t
) == std::tie(
other.i, other.f, other.t
);
}
Per aggiungere n nuovi membri puoi aggiungere semplicemente una nuova voce alla prima tabella. Tutto il resto viene generato automaticamente.
Un altro vantaggio è, è possibile aggiungere semplicemente un dump()
metodo come
void print(void) const {
#define STR(x) #x
#define _(x) x
#define X(type, name, default) \
std::cout << \
STR(name) << ": " << name << " ";
MEMBER_TBL
#undef X
#undef _
#undef STR
std::cout << std::endl;
}
che si traduce in
void print() const {
std::cout << "i" << ": " << i << " "; std::cout << "f" << ": " << f << " "; std::cout << "t" << ": " << t << " ";
std::cout << std::endl;
}
Tutte le informazioni relative ai membri potrebbe essere aggiunto alla tabella in un unico posto (singolo punto di informazione) ed estratto altrove necessario.
A lavoro Demo.
È possibile utilizzare memcmp se il proprio oggetto è POD o gran parte di esso POD (su quella parte) – VladimirS
È possibile scrivere uno script (nel proprio editor se supportato. Le sostituzioni di espressioni regolari Vim potrebbero farlo, ad esempio) prendere una copia delle righe di dichiarazione e trasformarle in 'element == other.element &&' –
@ user3545806 'memcmp' non renderà conto del riempimento, in modo che non funzioni. – Barry