Vous pouvez tirer parti de la surcharge du premier argument.
//For human-readable output
std::ostream& operator<< (std::ostream& os, my_enum e);
//For database; note the absence VVV of & sign here
std::ostream& operator<< (databasefmt fmt, my_enum e)
{
std::ostream& os = fmt.stream;
// Write data to os
// ...
return os;
}
struct databasefmt{
std::ostream& stream;
databasefmt(std::ostream & s) : stream(s) {};
};
ensuite écrire modificateur de flux qui convertit le flux d'emballage databasefmt classe, de sorte que la sortie à côté de ce flux modifié serait sortie de la base de données pour vous ENUM. Le code d'impression ressemblerait à ceci:
output_stream << "DATA: "<< database_format << my_enum::Value << "END OF DATA" ;
// Type: std::ostream | databasefmt | std::ostream |
et l'emballage comme celui-ci:
//Variable is needed to avoid confusing parentheses in output operators
struct databasefmt_converter_t {} database_format;
// we can't return reference, so we just return fairly small instance of wrapper
databasefmt operator<< (std::ostream& os, databasefmt_converter_t const&)
{ return databasefmt(os); }
Comment 'database_format' serait implémenté? – dalle
Vous renvoyez une référence à une variable locale dans l'opérateur << (std :: ostream & os, __databasefmt_converter &). – dalle
@dalle: Ajout d'un exemple. En passant, "stream modificateurs" une technique commune et a plusieurs implémentations possibles, certains d'entre eux diffèrent de mon exemple. –