Per verificare e visualizzare il risultato di alcune funzioni della mia libreria, sto creando un insieme di funzioni a portata di mano.Sovraccarico dell'operatore di conversione di tipo globale
devo una funzione execute
che assomiglia:
template <typename R, typename I>
std::string execute(const std::string& func_name, R(*func_ptr)(const I&), const I& func_input);
Si chiama la funzione, e visualizzare i risultati e gli argomenti in una stringa formattata che posso inviare a std::cout
.
Il problema è che alcune delle mie funzioni non restituiscono risultati convertibili in stringa. Ho pensato che avrei potuto semplicemente sovraccaricare il globale ::operator std::string
con qualcosa di simile:
template <typename T>
operator std::string(const std::vector<T>& v);
Ma GCC si lamenta:
error: 'operator std::string(const std::vector<T, std::allocator<_CharT> >&)' must be a nonstatic member function
Beh, il problema, naturalmente, è che non posso aggiungere soci gestori std::vector
, e anche per le mie lezioni, non voglio inquinarle con "per testare" gli operatori di conversione.
Immagino di poter aggiungere uno strato di riferimento indiretto e utilizzare una funzione anziché un operatore di conversione, ma non sarebbe la soluzione più estetica. Potrei anche sovraccaricare ::operator <<
per std::ostream
e utilizzare uno std::ostringstream
, ma anche questa non è la soluzione più pulita.
Mi chiedevo se l'operatore di conversione globale non fosse realmente sovraccarico e, in tal caso, perché.
Ma molti operatori sono disponibili come globale o membro, perché non questo? Ad esempio, se c'è un operatore globale e un membro <<, il compilatore si lamenta per una chiamata ambigua, potrebbe fare la stessa cosa con le conversioni. – NewbiZ
Le funzioni di conversione sono funzioni membro speciali (così come Ctor, Dtor, Op = e Copia-Costruttore) poiché partecipano alla creazione di conversioni/oggetti. Vedi 12.3. – dirkgently